工程化编程实战callback接口学习笔记--高软作业2

本次实验任务:

  • 在VSCode下编译运行lab5-1.tar.gz 即http://pan.baidu.com/s/1pJ0qAIv

  • 通过VSCode+GDB调试程序找出quit命令无法运行的bug产生的原因

  • 分析callback接口的运行机制,总结callback接口设计的方法

实验环境:

  • Windows10+VS code+MinGW64

实验步骤

一、在VSCode下编译运行lab5-1.tar.gz 

 先安装Mingw,安装时不能在路径中含空格。比如安装在C:\Mingw,然后在环境变量中添加C:\Mingw\bin,重启电脑

工程化编程实战callback接口学习笔记--高软作业2_第1张图片

然后在vscode中安装cpp tool,即c++拓展。安装完成后创建一个文件夹并配置一个cpp的json,主要是修改mingw路径保证编译正常运行

工程化编程实战callback接口学习笔记--高软作业2_第2张图片

 

测试是否正常运行

工程化编程实战callback接口学习笔记--高软作业2_第3张图片

 

二.寻找bug并纠正

  先安装好pthread,因为是在Windows下不能直接运行,需要先安装,安装之后用 -lpthread测试

工程化编程实战callback接口学习笔记--高软作业2_第4张图片

 

  测试,使用test程序,发现bug

工程化编程实战callback接口学习笔记--高软作业2_第5张图片

while(pNode != pLinkTable->pTail)
    {    
        if(Conditon(pNode) == SUCCESS)
        {
            return pNode;                   
        }
        pNode = pNode->pNext;
    }
return NULL;
//这个链表是有问题的,最后一个节点没判断

需要修改SearchLinkTableNode函数中while的判断条件,使其能够访问链表中的最后一个元素

 工程化编程实战callback接口学习笔记--高软作业2_第6张图片

修改判断条件,暴力法跳出,程序运行正常

三.分析callback回调

工程化编程实战callback接口学习笔记--高软作业2_第7张图片

回调方法特点是将回调函数以参数的形式将函数指针传递给另一个中间函数,可以提高代码重用度,降低重复函数,更易读。

在文件中以以下方式出现:

 /* search by callback */
    debug("SearchLinkTableNode\n");
    tNode* pTempNode = (tNode*)SearchLinkTableNode(pLinkTable,SearchCondition);
    printf("%d\n",pTempNode->data);

另一种方法也可以实现,在代码中表述为

/* search one by one */
    pTempNode = Search(pLinkTable);
    printf("%d\n",pTempNode->data);
    debug("DelLinkTableNode\n");
    DelLinkTableNode(pLinkTable,(tLinkTableNode *)pTempNode);
    free(pTempNode); DeleteLinkTable(pLinkTable);

callback在文中定义为

tNode * Search(tLinkTable *pLinkTable)
{
    debug("Search GetLinkTableHead\n");
    tNode * pNode = (tNode*)GetLinkTableHead(pLinkTable);
    while(pNode != NULL)
    {
        if(pNode->data == 5)
        {
            return pNode; } debug("GetNextLinkTableNode\n"); pNode = (tNode*)GetNextLinkTableNode(pLinkTable,(tLinkTableNode *)pNode); } return NULL; } int SearchCondition(tLinkTableNode * pLinkTableNode) { tNode * pNode = (tNode *)pLinkTableNode; if(pNode->data == 6) { return SUCCESS; } return FAILURE; }

回调方式分为阻塞式回调和延迟式回调。

阻塞式回调里,回调函数的调用一定发生在起始函数返回之前;而延迟式回调里,回调函数的调用有可能是在起始函数返回之后。

 

你可能感兴趣的:(工程化编程实战callback接口学习笔记--高软作业2)