工程化程式設計實戰callback介面學習筆記

2022-08-21 05:24:13 字數 2248 閱讀 9950

實驗要求一配

置環境1 安裝gcc

將檔案解壓,我這裡放的是c:\program files\mingw-w64\mingw\bin資料夾

2 在系統變數中的path新增環境變數

開啟命令列視窗,輸入gcc -v看見gcc版本相關資訊,安裝完成

3 安裝vscode,並安裝c/c++偵錯程式

環境配置完成

二 用vscode執行示例**

在終端輸入:

提示有兩個錯誤

錯誤1:缺少函式strcmp標頭檔案string.h宣告,在menu.c中新增string.h標頭檔案

錯誤2:缺少pthread標頭檔案,該問題比較複雜,具體解決方法參考

新增完pthread庫後在終端輸入:

gcc -o test menu.c linktable.c -lpthread
成功生成目標程式

輸入./test執行程式,輸入help,quit指令

quit命令提示是乙個錯誤的指令。

三 通過vscode+gdb除錯程式找出quit命令無法執行的bug產生的原因

找到main輸入指令位置,cmd是乙個全域性變數,由這裡我們可以知道p為空,所以會錯誤,

該函式的實現大概是,從煉表頭開始遍歷,對比鍊錶節點,找到符合節點就返回該節點指標,失敗則返回null

這裡鍊錶不為空且condition函式存在,應該是迴圈結束沒有返回節點,執行最後的return null語句

仔細分析迴圈體:while(pnode != plinktable->ptail)該迴圈條件表示節點不為表尾則繼續迴圈,但是我們檢視initmenudata(tlinktable ** pplinktable)函式發現,quit節點剛好就是鍊錶的尾,所以遍歷到該節點時沒有訪問就跳出迴圈了,因此這裡返回了null

我們將判斷條件改為

while(pnode != null)
重新執行,程式成功執行

1 **函式的執行機制

**函式是指使用者自己定義乙個函式,實現這個函式的程式內容,然後把這個函式(入口位址)作為引數傳入別人(或系統)的函式中,由別人(或系統)的函式在執行時來呼叫的函式。函式是你實現的,但由別人(或系統)的函式在執行時通過引數傳遞的方式呼叫,這就是所謂的**函式。簡單來說,就是由別人的函式執行期間來**你實現的函式。

這一設計允許了底層**呼叫在高層定義的子程式。c語言中**函式主要通過函式指標的方式實現。

本例中使用了**函式的機制,本例中findcmd(tlinktable * head, char * cmd)呼叫searchlinktablenode(head,searchcondition)函式,而searchlinktablenode通過呼叫了**函式condition()。實現函式呼叫中,函式呼叫了「呼叫函式」,再在其中進一步呼叫被「呼叫函式」。相比於主函式直接呼叫「被調函式」,這種方法為使用者,而不是開發者提供了靈活的介面。另外,函式入口可以像變數一樣設定同樣為開發者提供了靈活性。

2 callback介面設計的方法

工程化程式設計實戰callback介面學習

工程化程式設計實戰callback介面學習 使用gcc工具進行編譯,這裡用到的命令是 gcc linktable.c menu.c o se2020這個時候會發現報錯,出現了警告,原因是menu.c中缺少了string類庫,無法使用strcmp 匯入include後,重新編譯 3.執行程式 2020...

工程化程式設計實戰callback介面學習筆記

這是高軟的第二次作業,主要就是程式設計實戰,這次確實學到了東西,以前只是直到 函式,但是不知道 函式是幹嘛用的。一 實驗要求 在vscode下編譯執行 通過vscode gdb除錯程式找出quit命令無法執行的bug產生的原因 分析callback介面的執行機制,總結callback介面設計的方法 ...

工程化程式設計實戰callback介面學習筆記

實驗內容 1.在vscode下編譯執行lab5 1.tar.gz 即 2.通過vscode gdb除錯程式找出quit命令無法執行的bug產生的原因 通過實驗步驟1的執行結果可知,quit命令無法正常退出,找到列印出 this is a wrong cmd!對應的 塊,找到findcmd函式,發現是...