From dd5d39bb1d95390646344421cfca696a6b9ae91e Mon Sep 17 00:00:00 2001 From: Saturneic Date: Sat, 12 Jan 2019 15:31:12 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 26 +++++++++++++------------- include/chain/chain.h | 6 +++--- include/communicate/communicate_file.h | 2 -- include/type.h | 6 ------ src/datastruct/chain/chain_find.c | 2 +- src/datastruct/chain/chain_get.c | 18 +++++++++++++++--- src/memory/list/list_release.c | 2 +- 7 files changed, 33 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 947b1f5..d6f75d3 100644 --- a/README.md +++ b/README.md @@ -6,29 +6,29 @@ ### 详细梗概 该库以模块化的方式来组织,主要模块包括内存管理模块、高级数据结构模块、文件储存模块、网络传输模块、子程序管理模块、回调机制实现模块、错误管理模块、在主要模块还会被分为几个小模块。模块之间有对应的依赖关系。 -#### 内存管理模块 -该库以内存管理模块为基础,通过两种内存管理结构,对于储存在内存中的数据进行组织、操作。该模块的子模块主要分为链式内存管理,块式内存管理。链式内存管理对于内存中离散的数据进行组织和管理;块式内存管理对于内存中的整块数据进行管理。这两个子模块会分别实现链式和块式的内存管理的管理结构及相关操作。该模块的第三个子模块是内存泄露管理模块,该模块对于已经分配的内存空间进行全面地监控,及时地完全地释放不需要的内存空间。内存泄漏管理对于长期运行的软件系统来说至关重要。链式和块式内存管理具体要实现的基本操作函数有:初始化类函数、赋值类函数、复制类函数、插入类函数、删除类函数、查询类函数、释放类函数。 +#### 内存管理模块(memory) +该库以内存管理模块为基础,通过两种内存管理结构,对于储存在内存中的数据进行组织、操作。该模块的子模块主要分为链式内存管理(list),块式内存管理(block)。链式内存管理对于内存中离散的数据进行组织和管理;块式内存管理对于内存中的整块数据进行管理。这两个子模块会分别实现链式和块式的内存管理的管理结构及相关操作。该模块的第三个子模块是内存泄露管理模块,该模块对于已经分配的内存空间进行全面地监控,及时地完全地释放不需要的内存空间。内存泄漏管理对于长期运行的软件系统来说至关重要。链式和块式内存管理具体要实现的基本操作函数有:初始化类函数、赋值类函数、复制类函数、插入类函数、删除类函数、查询类函数、释放类函数。 -#### 高级数据结构模块 -高级数据结构模块是对于内存管理模块的一次封装和抽象,它依赖于内存管理模块所提供的链式内存和块式内存管理结构和相关操作方法,运用相关方法来实现高级数据结构及其基本操作和算法。这些高级数据结构包括:目录树、二叉树、堆、栈、队列、有向图、无向图、链表、字典、字符串。通过高级数据模块,使得库能够更加快速地对于实际问题进行建模,更加有效率的解决实际问题。高级数据结构的子模块包含:基本操作子模块和算法子模块。前者完成了对于高级数据结构的基本操作:初始化数据结构、插入数据、删除数据、更新数据;后者将提供高级数据结构常用的高级算法:查找算法、排序算法、优化算法、转换算法。 +#### 高级数据结构模块(datastruct) +高级数据结构模块是对于内存管理模块的一次封装和抽象,它依赖于内存管理模块所提供的链式内存和块式内存管理结构和相关操作方法,运用相关方法来实现高级数据结构及其基本操作和算法。这些高级数据结构包括:目录树(tree)、二叉树、堆、栈、队列、有向图、无向图、链表(chain)、字典、字符串。通过高级数据模块,使得库能够更加快速地对于实际问题进行建模,更加有效率的解决实际问题。高级数据结构的子模块包含:基本操作子模块和算法子模块。前者完成了对于高级数据结构的基本操作:初始化数据结构、插入数据、删除数据、更新数据;后者将提供高级数据结构常用的高级算法:查找算法、排序算法、优化算法、转换算法。 -#### 文件储存模块 -文件储存模块依赖内存管理模块、回调机制模块和高级数据结构模块,该模块实现将内存数据管理结构与高级数据结构的信息及其中储存的数据储存到到文件中。该模块中定义的文件管理结构分为两类:关系型文件管理结构,非关系型文件管理结构。这两个结构的区别是是否记录所储存信息之间的关系。前者将有专门的数据结构来储存所储存的数据之间的联系,后者按照块的形式来叠放数据。模块内部将专门实现这两个数据管理结构写入文件、从文件读出的操作方法。并且,将实现各个高级数据结构与文件管理结构之间的转化。这样,能够直接将高级数据结构转化为文件管理结构,从而储存到文件中。或者,将文件中的数据读出,独处的数据在内存中的表现形式为对应的文件管理结构,而后再将文件管理结构转化为对应的高级数据结构。模块将实现对于这两种结构的操作方法:初始化,转化,写入,读取,释放。 +#### 文件储存模块(communicate_file) +文件储存模块依赖内存管理模块、回调机制模块和高级数据结构模块,该模块实现将内存数据管理结构与高级数据结构的信息及其中储存的数据储存到到文件中。该模块中定义的文件管理结构分为两类:关系型文件管理结构(std),非关系型文件管理结构。这两个结构的区别是是否记录所储存信息之间的关系。前者将有专门的数据结构来储存所储存的数据之间的联系,后者按照块的形式来叠放数据。模块内部将专门实现这两个数据管理结构写入文件、从文件读出的操作方法。并且,将实现各个高级数据结构与文件管理结构之间的转化。这样,能够直接将高级数据结构转化为文件管理结构,从而储存到文件中。或者,将文件中的数据读出,独处的数据在内存中的表现形式为对应的文件管理结构,而后再将文件管理结构转化为对应的高级数据结构。模块将实现对于这两种结构的操作方法:初始化,转化,写入,读取,释放。 -#### 网络传输模块 -网路传输模块依赖内存管理模块、回调机制模块、高级数据结构模块和文件储存模块,此模块主要提供将高级数据结构转化为文件信息管理结构,文件管理结构转化为网络信息块管理结构,将信息分块进行传输。对于简单的字符信息,该模块也提供网络消息管理结构,通过该结构能够在一台计算机和另外一台计算机之间传递字符串消息。模块将实现对于这两种结构的操作方法:初始化、转化、赋值、传输、释放。 +#### 网络传输模块(communicate_network) +网路传输模块依赖内存管理模块、回调机制模块、高级数据结构模块和文件储存模块,此模块主要提供将高级数据结构转化为文件信息管理结构,文件管理结构转化为网络信息块管理结构,将信息分块进行传输。对于简单的字符信息,该模块也提供网络消息管理结构(message),通过该结构能够在一台计算机和另外一台计算机之间传递字符串消息。模块将实现对于这两种结构的操作方法:初始化、转化、赋值、传输、释放。 -#### 回调机制模块 +#### 回调机制模块(event) 回调机制模块依赖内存管理模块和高级数据结构,该模块实现一种方法调用机制,将实现回调函数的注册、传参、返回值传参的标准化宏与相关支撑函数。高级模块中的相关方法,通过使用以上的宏和函数,中能够以更加标准的、更加优雅的方法来实现相关功能。这也使得,事件机制的运用能够更加便捷有效,从而跨计算机之间的函数调用与传参成为可能。 -#### 错误管理模块 +#### 错误管理模块(error) 错误管理模块依赖内存管理模块和回调机制模块,该模块提供程序输出信息的分类:严重错误、错误、警告、提示。该模块将实现错误的处理函数的注册,在严重错误或者错误出现的情况下,根据开发者通过该模块的错误处理函数的注册信息,调用相应的错误处理函数并提供关键信息来辅助错误修复。该模块将提供相应的管理结构与方法来建立程序中的相关信息的日志文件,并且提供更加方便的方法来管理与更新相应的日志文件,实现程序输出信息的更加规范的清晰地产生与显示。 -#### 子程序管理模块 +#### 子程序管理模块(subfunc) 该模块依赖以上的所有模块,该模块也为该库的最高级的部分。该模块提供子程序的注册,调用,传输以及依赖关系的管理。子程序是一个独立的软件系统的所有功能的一部分,具有相对的独立性。一个程序的子程序可以储存在相同的计算机上,也可以储存在不同的计算机上,子程序之间不论储存的地方在何处,只要能够通过内存或者网络的方式访问到,则可以进行传参和调用。位置信息的记录与子程序的调用由相应的管理结构与操作方法来实现。对于一个要由多个子程序之间协调合作来完成的复杂任务的情景,该模块将通过子程序依赖关系管理结构及其方法来进行相应的系统性的有序调用。对于一个大任务中两个不互为依赖的过程,在允许的情况下模块将进行并行调用。通过子程序的传输方法,子程序能够更加方便地通过网络在计算机之间进行转移。总之,通过该模块,实现了一个独立的软件系统在不同的计算机中储存并且运行在不同计算机的内存中却可以虚拟出在同一计算机中储存运行的效果,能够并行执行软件系统中的某些功能,也可以让软件系统的设计者随时根据具体情况来转移子程序。 -### 通信模块 -由于实际原因,网络传输模块与文件储存模块合为通信模块。 +### 通信模块(communicate) +由于实际原因,网络传输模块与文件储存模块合为通信模块。通信模块统一负责内存管理结构、高级数据结构与文件和网络的对接工作。 ### 目录结构管理方式 - src:源文件 diff --git a/include/chain/chain.h b/include/chain/chain.h index 2e26ba0..9f87853 100644 --- a/include/chain/chain.h +++ b/include/chain/chain.h @@ -2,7 +2,7 @@ #define chain_h #include -#include +#include /************************************************ *节点的快速初始化: 为新节点分配内存空间, @@ -232,7 +232,7 @@ extern void *getByPointerForNode(CNode *); /* *直接获得节点的序号 *返回: 返回该节点在链表中的序号*/ -extern unsigned long long getIndexForNode(Chain *p_list,CNode *p_node); +extern uint64_t getIndexForNode(Chain *p_list,CNode *p_node); /* *通过节点的序号找到节点中相关的值,并更新其中的储存的值的指针. @@ -262,7 +262,7 @@ Chain *copyList(Chain *p_list); /* *通过序号查找相关的单个节点 *返回: 如果成功返回指向该节点的指针,如果失败则返回NULL.*/ -extern CNode *findByIndexForNode(Chain *, unsigned long long); +extern CNode *findByIndexForNode(Chain *, uint64_t); /* *通过整型值查找储存该值的单个节点 diff --git a/include/communicate/communicate_file.h b/include/communicate/communicate_file.h index 0646f59..614f787 100644 --- a/include/communicate/communicate_file.h +++ b/include/communicate/communicate_file.h @@ -102,8 +102,6 @@ extern int dataFileReadOut(D_FILE *p_dfile); - - /************************************************ 相关结构的释放操作: 释放相关结构体所占内存空间的相关函数 ************************************************/ diff --git a/include/type.h b/include/type.h index da588d2..c59d126 100644 --- a/include/type.h +++ b/include/type.h @@ -33,7 +33,6 @@ #define STRING 3 #define POINTER 4 #define LIST 5 -#define STACK 6 #define TREE 7 #define LIST_NODE 8 #define TREE_NODE 9 @@ -43,7 +42,6 @@ #define STANDARD_DATA 13 #define DATA_FILE 14 #define MESSAGE 15 -#define HOLE 16 #define ULLINT 17 @@ -69,10 +67,6 @@ #define FILE_TSET_LEN 18 #define HEAD_TEST_LEN 9 #define INFO_TEST_LEN 8 -#define ENABLE_LIST_QUICK 65535 -#define FN_NODE_SPARE 500 -#define INDEX_CHANGE_MAX 500 -#define INDEX_DISTANCE_MAX 120 #define STD_TEXT_LEN 4 #define HIGH 0x3 #define STANDARD 0x2 diff --git a/src/datastruct/chain/chain_find.c b/src/datastruct/chain/chain_find.c index 2af4a58..b3abd17 100644 --- a/src/datastruct/chain/chain_find.c +++ b/src/datastruct/chain/chain_find.c @@ -187,7 +187,7 @@ inline Chain *mply_findByPointerForNode(Chain* p_list, void *temp) { @param m_index 序号位置 @return 返回指向符合条件的链表的指针 */ -CNode *findByIndexForNode(Chain *p_list, unsigned long long m_index) { +CNode *findByIndexForNode(Chain *p_list, uint64_t m_index) { if(p_list == NULL) return NULL; CNode *p_node = p_list->head; unsigned long long i; diff --git a/src/datastruct/chain/chain_get.c b/src/datastruct/chain/chain_get.c index 440bf29..3564c33 100644 --- a/src/datastruct/chain/chain_get.c +++ b/src/datastruct/chain/chain_get.c @@ -21,7 +21,7 @@ int getByIntForNode(CNode *p_node) { @return 成功则返回对应无符号整型值,失败返回0 */ unsigned int getByUIntForNode(CNode *p_node){ - if (p_node->type == UINT) return *(unsigned int *)(p_node->value); + if (p_node->type == UINT) return *(uint32_t *)(p_node->value); else return 0; } @@ -65,9 +65,9 @@ void *getByPointerForNode(CNode *p_node) { @param p_node 指向目标节点的指针 @return 成功返回相应排列序号,失败则会返回0 */ -unsigned long long getIndexByNode(Chain *p_list, CNode *p_node) { +uint64_t getIndexByNode(Chain *p_list, CNode *p_node) { register CNode *t_node = p_list->head; - register unsigned long long index = 0; + register uint64_t index = 0; while (t_node != NULL) { // id模块可能启用的时候则编译以下代码 #ifdef id_enable @@ -78,3 +78,15 @@ unsigned long long getIndexByNode(Chain *p_list, CNode *p_node) { } return 0; } + +/** + 通过链表中相应的节点获得其在链表中的排列序号 + + @param p_list 指向目标链表 + @param p_node 指向目标节点的指针 + @return 成功返回相应排列序号,失败则会返回0 + */ +extern uint64_t getIndexForNode(Chain *p_list,CNode *p_node){ + return getIndexByNode(p_list, p_node); + +} diff --git a/src/memory/list/list_release.c b/src/memory/list/list_release.c index 70d6586..dea643b 100644 --- a/src/memory/list/list_release.c +++ b/src/memory/list/list_release.c @@ -6,7 +6,7 @@ int releaseNode(Node *p_node) { removeByNode(node_list, p_node); } if (p_node->value != NULL) { - if (p_node->type != POINTER && p_node->type != HOLE) { + if (p_node->type != POINTER) { if (p_node->type == LIST) { releaseList((List *)p_node->value); }