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

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

发现提示warning,缘由是没有导入头文件,须要导入#include <string.h>ui

从新编译,显示成功spa

 

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

 

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

进入到FindCmd函数进行查看调试

 

 

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

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

因为help能成功执行,那么问题必然出如今不等于pLinkTable->pTail 字符串

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

而最后一个节点的pNext会置为空。因此咱们将条件改成 pNode != null  即可完成!

 

 

 能够看到,修改后成功了!

 

 

用GDB调试

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

 

 

 

(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 <cmd> "quit") at menu.c:60
60	    return  (tDataNode*)SearchLinkTableNode(head,SearchCondition);  //按s进入函数内部查看
(gdb) s
SearchLinkTableNode (pLinkTable=0x603010, Conditon=0x400bf3 <SearchCondition>)
    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 <cmd> "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;

  

回调函数

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

 

相关文章
相关标签/搜索