工程化編程實戰callback接口學習筆記

1.環境搭建

1.1 在mac平臺使用vscode進行環境搭建

  • 安裝C/C++插件
  • 安裝gcc,mac可能自帶有gcc,可以使用gcc --version查看gcc版本
  • 打開項目文件並另存爲工做區
  • 配置tasks.json和launch.json文件

1.2 解決Debugger executable '/usr/local/bin/gdb' is not signed.報錯

     緣由是在Mac系統(10.9)裏默認不容許GNU gdb訪問其餘進程,須要對gdb進行簽名。json

     具體作法可參考 https://www.jianshu.com/p/303bc5f53a52 給gdb受權或者添加信任證書數據結構

1.3 mac Catalina環境中要使用vscode進行調試還須要安裝code runner和codelldb插件,並在設置中添加:

     "code-runner.runInTerminal": true函數

2.項目分析和bug查找

2.1 項目數據結構

 

 

2.2 運行項目,報錯隱式調用庫函數卻沒有include該文件,在menu.c頭部添加#include<string.h>

 

2.3 運行menu程序,發現quit指令出錯,返回「This is a wrong cmd」

//根據代碼可知此時 p==NULL
tDataNode *p = FindCmd(head, cmd);
if( p == NULL)
{
    printf(
"This is a wrong cmd!\n "); continue; }
//FindCmd函數中又調用的SearchLinkTableNode函數
 tDataNode* FindCmd(tLinkTable * head, char * cmd)
  {
     return (tDataNode*)SearchLinkTableNode(head,SearchCondition);
  }
  //分析SearchLinkTableNode函數
  tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode))
  {
  if(pLinkTable == NULL || Conditon == NULL)
  {
  return NULL;
  }
  tLinkTableNode * pNode = pLinkTable->pHead;
  while(pNode != pLinkTable->pTail)
  {
  if(Conditon(pNode) == SUCCESS)
  {
  return pNode;
  }
  pNode = pNode->pNext;
  }
  return NULL;
  }
  //while循環條件爲:當pNode不指向隊尾的時候才能進入循環,則處於鏈表隊尾的最後一個指令不會被識別
  //quit函數正好是初始化時最後一個放入指令鏈表的函數,因此輸入quit時返回的是空

2.4 Debug調試代碼

在while循環處和SearchConditin函數處加斷點進行調試ui

並監視數據變化狀況spa

能夠看到輸入的指令爲「quit」,第一次循環的節點指令爲「help」,點擊繼續(F8)插件

再繼續則退出了while循環,證明了上文的分析。循環斷定條件出錯致使處於隊尾的指令不被識別。指針

//更改循環條件則能夠避免這種狀況
while(pNode != NULL)

 

 能夠看到成功識別了quit指令調試

3.callback回調函數總結

當某一函數A想要調用一箇中間函數時,這個中間函數容許函數A來定義部分函數行爲,從代碼的角度來講就是這個中間函數要求函數A(以函數指針的形式)先傳入一個函數B,這個B就叫回調函數。中間函數須要這個函數B來構成完整的操做邏輯。code

類比就像我找4S店說要買車,我先把個人要求(回調函數)給4S店(中間函數),4S店根據個人要求返還我一份符合條件的車型。blog

在此項目中

//在項目中就使用了回調函數
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode))
//使用時傳入的是menu.c中的SearchCondition函數
(tDataNode*)SearchLinkTableNode(head,SearchCondition);

回調函數的優勢:

  • 能夠靈活的改變中間函數的行爲
  • 下降耦合,易於更新需求
  • 分離了使用者和中間函數,必定程度上能夠保護數據隱私,你只能用我當前給你的回調函數
相關文章
相關標籤/搜索