lab 5.2项目结构
linktableInternal.h: 该文件包含了两个结构体,分别为LinkTableNode, LinkTable。linkTableNode结构体是链表节点,指向下一个链表指针的节点;linkTable结构体是链表。
linktable.h: 引用linktableInternal.h,定义了对链表和链表节点操作的方法
linktable.c:Linktable.h所定义的方法的具体实现
回调函数
回调函数是一种常用于软件开发的机制,它通过函数指针实现了函数之间的灵活调用。具体而言,回调函数是将一个函数的指针作为参数传递给另一个函数,在后者执行过程中通过该指针调用前者。回调函数通常用于特定的响应操作,减小了模块之间的依赖。
以实验代码为例:
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable,
int Condition(tLinkTableNode * pNode, void * args),
void * args)
{
if(pLinkTable == NULL || Condition == NULL)
{
return NULL;
}
tLinkTableNode * pNode = pLinkTable->pHead;
while(pNode != NULL)
{
if(Condition(pNode, args) == SUCCESS)
{
return pNode;
}
pNode = pNode->pNext;
}
return NULL;
}
此处在遍历过程中,使用Condition函数来判断所设定的条件。SearchLinkTableNode函数并不关注Condition的实现条件,只需在满足时跳出即可。
在满足Condition函数的参数条件下,我们可以自己设定Condition条件,将其作为参数传入即可,在不同的地方可以实现多种不同的功能,实现了代码的解耦,增强了代码的可重用性。
在该实验中,Condition的实现如下:
int SearchCondition(tLinkTableNode * pLinkTableNode, void * args)
{
char * cmd = (char*) args;
tDataNode * pNode = (tDataNode *)pLinkTableNode;
if(strcmp(pNode->cmd, cmd) == 0)
{
return SUCCESS;
}
return FAILURE;
}
以异步callback为例
在多线程情况下,主线程需要根据其他线程的执行结果做一定地处理,在此过程中,只需A向B注册回调函数,在B处理完之后使用该Callback函数返回处理结果给A即可。