這是高軟的第二次作業,主要就是程式設計實戰,這次確實學到了東西,以前只是直到**函式,但是不知道**函式是幹嘛用的。
一、實驗要求
在vscode下編譯執行**
通過vscode+gdb除錯程式找出quit命令無法執行的bug產生的原因
分析callback介面的執行機制,總結callback介面設計的方法
二、實驗過程
2、找quit函式無法執行的bug
gcc -g linktable.c menu.c -o menu 輸入'quit'指令,發現執行quit命令無法退出程式
可以看出是因為p的指標為空
通過gbd除錯發現,**的實際操作和分析的是完全一樣的。
首先打上斷點,然後r程式
一步步除錯
最後發現這個函式返回null,定位了bug
檢視**,發現linktable.c中的searchlinktablenode函式存在問題如下所示:
/*分析如下:while迴圈條件while(pnode != plinktable -> ptail)使得函式在找到鍊錶最後乙個節點時即退出迴圈,因此無法訪問最後乙個節點,而退出的話需要找到最後的節點,所以我們可以將錯誤**while(pnode != plinktable -> ptail)改為while(pnode != null)來解決bug修改後的執行結果如下:* search a linktablenode from linktable
* int conditon(tlinktablenode * pnode);
* 此處使用了**函式
*/tlinktablenode * searchlinktablenode(tlinktable *plinktable, int conditon(tlinktablenode * pnode))
tlinktablenode * pnode = plinktable->phead;
while(pnode != plinktable->ptail)//在找到鍊錶最後乙個節點時即退出迴圈,最後乙個節點還在啊
pnode = pnode->pnext;
}return null;
}
說明成功解決了bug。
3、分析callback介面的執行機制
檢視老師給的**:
3.1 **函式是把函式的指標作為引數傳遞給另乙個函式,callback函式的呼叫實質上是在乙個模組內部呼叫模組外部的另乙個模組實現的函式。**函式不是由該函式的實現方直接呼叫,而是在特定的事件或條件發生時由另外的一方呼叫的,用於對該事件或條件進行響應。
3.2 **函式可以允許使用者把需要呼叫的函式的指標作為引數傳遞給乙個函式,以便該函式在處理相似事件的時候可以靈活的使用不同的方法。
3.3 callback函式的使用提高了**的重用性,實現了更鬆的耦合。同時將一些內部結構介面隱藏,簡化了使用者介面,更保證了使用安全,減少誤操作。
工程化程式設計實戰callback介面學習
工程化程式設計實戰callback介面學習 使用gcc工具進行編譯,這裡用到的命令是 gcc linktable.c menu.c o se2020這個時候會發現報錯,出現了警告,原因是menu.c中缺少了string類庫,無法使用strcmp 匯入include後,重新編譯 3.執行程式 2020...
工程化程式設計實戰callback介面學習筆記
實驗要求一配 置環境1 安裝gcc 將檔案解壓,我這裡放的是c program files mingw w64 mingw bin資料夾 2 在系統變數中的path新增環境變數 開啟命令列視窗,輸入gcc v看見gcc版本相關資訊,安裝完成 3 安裝vscode,並安裝c c 偵錯程式 環境配置完成...
工程化程式設計實戰callback介面學習筆記
實驗內容 1.在vscode下編譯執行lab5 1.tar.gz 即 2.通過vscode gdb除錯程式找出quit命令無法執行的bug產生的原因 通過實驗步驟1的執行結果可知,quit命令無法正常退出,找到列印出 this is a wrong cmd!對應的 塊,找到findcmd函式,發現是...