工程化编程实战callback接口学习笔记

首先输入 gcc memu.c linktable.c -o memu 进行编译

发现提示warning,原因是没有导入头文件,需要导入#include

工程化编程实战callback接口学习笔记_第1张图片

重新编译,显示成功

 

运行编译完的文件 memu ,输入help 发现还有quit命令,输入quit命令后报错。

工程化编程实战callback接口学习笔记_第2张图片

 

 打开源代码进行分析。发现当 p 为空时,会输出 This is a wrong cmd !

工程化编程实战callback接口学习笔记_第3张图片

进入到FindCmd函数进行查看

工程化编程实战callback接口学习笔记_第4张图片

 

 

 很明显,FindCmd 执行完SearchLinkTableNode后返回空字符串,进入到此函数进行原因分析

然后发现,只有pNode不为空且 不等于pLinkTable->pTail时,才会返回pNode指针。问题应该就出现在这。

由于help能成功执行,那么问题必然出现在不等于pLinkTable->pTail 

工程化编程实战callback接口学习笔记_第5张图片

通过查看初始化,发现quit是最后一个。那么显然,上面循环体判断条件,如果不是最后一个,就进入循环,导致了最后一个节点不会被遍历到

而最后一个节点的pNext会置为空。所以我们将条件改为 pNode != null  便可完成!

工程化编程实战callback接口学习笔记_第6张图片工程化编程实战callback接口学习笔记_第7张图片

 

 

 可以看到,修改后成功了!

工程化编程实战callback接口学习笔记_第8张图片

 

 

用GDB调试

重新编译后,进入GDB环境,在101行打断点,然后执行run命令。

工程化编程实战callback接口学习笔记_第9张图片

 

 

 

(gdb) break 101
Breakpoint 1 at 0x400dbd: file menu.c, line 101.
(gdb) run
Starting program: /home/sun/桌面/lab5.1/memu 

Breakpoint 1, main () at menu.c:103
103	    InitMenuData(&head); 
(gdb) n
107	        printf("Input a cmd number > ");
(gdb) n
108	        scanf("%s", cmd);
(gdb) n
Input a cmd number > quit    //输入quit
109	        tDataNode *p = FindCmd(head, cmd);     //按s进入单步调试
(gdb) s
FindCmd (head=0x603010, cmd=0x6020a0  "quit") at menu.c:60
60	    return  (tDataNode*)SearchLinkTableNode(head,SearchCondition);  //按s进入函数内部查看
(gdb) s
SearchLinkTableNode (pLinkTable=0x603010, Conditon=0x400bf3 )
    at linktable.c:144
144	    if(pLinkTable == NULL || Conditon == NULL)
(gdb) n
148	    tLinkTableNode * pNode = pLinkTable->pHead;
(gdb) n
149	    while(pNode != pLinkTable->pTail)
(gdb) n
151	        if(Conditon(pNode) == SUCCESS)
(gdb) n
155	        pNode = pNode->pNext;
(gdb) n
149	    while(pNode != pLinkTable->pTail)
(gdb) n
151	        if(Conditon(pNode) == SUCCESS)
(gdb) n
155	        pNode = pNode->pNext;
(gdb) n
149	    while(pNode != pLinkTable->pTail)
(gdb) n
157	    return NULL;//可以看到,在三层循环后,返回了null
(gdb) n
158	}
(gdb) n
FindCmd (head=0x603010, cmd=0x6020a0  "quit") at menu.c:61
61	}
(gdb) n
main () at menu.c:110
110	        if( p == NULL)
(gdb) n
112	            printf("This is a wrong cmd!\n ");
(gdb) n
This is a wrong cmd!
113	            continue;

  

回调函数

回调函数就是一个通过 函数指针调用的函数。如果你把函数的 指针(地址)作为 参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
回调方法 是 任何一个 被 以该回调方法为其第一个参数 的 其它方法 调用 的方法。很多时候,回调是一个当某些事件发生时被调用的方法。

 工程化编程实战callback接口学习笔记_第10张图片

 

你可能感兴趣的:(工程化编程实战callback接口学习笔记)