工程化编程实战callback接口学习笔记
1. 在VSCode下编译运行lab5-1.tar.gz 即http://pan.baidu.com/s/1pJ0qAIv
quit指令被提示为wrong cmd,显然是不对的。
2. 通过VSCode+GDB调试程序找出quit命令无法运行的bug产生的原因
#int Conditon(tLinkTableNode * pNode)调用了回调函数
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode))
{
if(pLinkTable == NULL || Conditon == NULL)
{
return NULL;
}
tLinkTableNode * pNode = pLinkTable->pHead;
#此处循环退出条件为指针遍历至最后一个节点时退出循环
while(pNode != pLinkTable->pTail)
{
if(Conditon(pNode) == SUCCESS)
{
return pNode;
}
pNode = pNode->pNext;
}
return NULL;
}
quit命令无法正常退出,找到对应的代码块,FindCmd函数,发现没有找到匹配的命令,到SearchLinkTableNode,发现无法返回NULL的原因是linktable.c中149行的while循环无法进入,使得函数在在找到链表最后一个节点的时候退出循环,但没有判断最后一个节点,也就是说无法进入最后一个节点对应的循环,提前结束循环返回NULL,因此将linktable.c文件中的149行的while(pNode != pLinkTable->pTail)改为while(pNode != NULL)即可。
最终程序运行成功
3. 分析callback接口的运行机制,总结callback接口设计的方法
在回调中,我们利用某种方式,把回调函数像参数一样传入中间函数。可以这么理解,在传入一个回调函数之前,中间函数是不完整的。换句话说,程序可以在运行时,通过登记不同的回调函数,来决定、改变中间函数的行为。当我们想通过一个统一接口实现不同内容的时候,用回调函数来实现就非常合适。回调机制提供了非常大的灵活性,可以降低模块之间的耦合度。