工程化编程实战callback接口学习
Posted tanhao1410
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工程化编程实战callback接口学习相关的知识,希望对你有一定的参考价值。
一、测试运行
1、安装配置MinGW后,在VS中编译报错,如图:
2、后来参考其他同学,用linux进行编译,于是改变环境,连接了Ubuntu进行编译:
3、添加头文件#include<string.h>后,传至Ubuntu虚拟机,重新编译运行,结果如下:
二、寻找错误
1、可以在代码中发现,当输入quit时,此时出了问题:
2、进入FindCmd函数
tDataNode* FindCmd(tLinkTable * head, char * cmd) { return (tDataNode*)SearchLinkTableNode(head,SearchCondition); }
3、进入SearchLinkTableNode函数,可以看到这里有一个int Condition(tLinkTableNode* pNode)参数,这是一个callback函数。
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; }
4、通过上面的可以看到传入的实际函数是SearchCondition,目的就是在SearchLinkTableNode遍历节点时,通过什么样的方式进行比较,类似于Java 的Comparable接口,按照自己定义的方式去比较。
int SearchCondition(tLinkTableNode * pLinkTableNode) { tDataNode * pNode = (tDataNode *)pLinkTableNode; if(strcmp(pNode->cmd, cmd) == 0) { return SUCCESS; } return FAILURE; }
5、从上述分析中可以看出,程序目的是当用户输入help、version和quit会输出相应的命令。但是经过运行发现,help和version命令返回正确,而quit缺返回不到应有的结果(程序退出)。也就是SearchLinkTableNode函数返回了NULL。
/*修改后的SearchLinkTableNode*/ tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode)) { if(pLinkTable == NULL || Conditon == NULL) { return NULL; } tLinkTableNode * pNode = pLinkTable->pHead; while(pNode != NULL) //遍历所有节点 { if(Conditon(pNode) == SUCCESS) { return pNode; } pNode = pNode->pNext; } return NULL; }
6、重新编译运行
三、总结
可以看到SearchLinkTableNode函数的函数体中并不知道怎么样遍历结点才算是找到了,于是我们向他传入了一个函数,该函数就是告知SearchLinkTableNode函数如何才算是成功找到,该函数即是回调函数。我们可以看到回调函数的存在使得方法很是灵活,在其它语言中也有类似的做法,比如Java中的Comparable接口,Java中的统一的排序并不知道对象的排序方式,通过实现该接口(该接口内部有个抽象函数),内部会调用该对象的此方法,很是类似于C语言中的回调函数。
以上是关于工程化编程实战callback接口学习的主要内容,如果未能解决你的问题,请参考以下文章