工程化編程實戰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;

  

回調函數

回調函數就是一個經過 函數指針調用的函數。若是你把函數的 指針(地址)做爲 參數傳遞給另外一個函數,當這個指針被用來調用其所指向的函數時,咱們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
回調方法 是 任何一個 被 以該回調方法爲其第一個參數 的 其它方法 調用 的方法。不少時候,回調是一個當某些事件發生時被調用的方法。

 

相關文章
相關標籤/搜索