實驗要求一配
置環境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函式,發現是...