前段時間寫了篇介紹命令行交互工具,不知道各位有沒去看看源碼,里邊有個寫法和前段時間介紹的鏈表使用很像,這就是等下介紹的表驅編程模式,表驅的核心就是“表格”,在多條件判斷的時候會使用到多if嵌套,或者switch語法進行處理,但是這樣寫有時候也挺麻煩的,在這樣的場景下就可以考慮使用表驅編程模式,把需要處理的事件或數據放到對應的表格中,最后就形成了一整個表,就可以進行查表然后進行對應操作,下面舉個簡單案例:
| 頭文件
#include "stdio.h" #include "stdint.h" typedef struct { void(*fp)(void); } static_t; extern static_t static_cmd[]; void shell_ls_cmd(void); void shell_test_cmd(void); void shell_test_fp(void); void handle(void); void push(void (*fp)(void)); void free(uint8_t select);
|定義一個表
static_tstatic_cmd[]= { {shell_ls_cmd}, {shell_test_cmd}, {NULL} };
| 定義回調函數
void shell_ls_cmd(void) { printf("ls command "); } void shell_test_cmd(void) { printf("test command "); } void shell_test_fp(void) { printf("fp command "); }
| 遍歷表
void handle(void) { for (uint8_t i = 0; static_cmd[i].fp != NULL; i++) { static_cmd[i].fp(); } }
| 添加表格
void push(void (*fp)(void)) { uint8_t i = 0; // 寫法1 for(i = 0; static_cmd[i].fp != NULL; i++){}; // 寫法2 /* while(static_cmd[i].fp != NULL){ i++; } */ static_cmd[i].fp = fp; static_cmd[i+1].fp = NULL; }
|刪除表格
void free(uint8_t select) { if(static_cmd[select].fp == NULL) { return; } for (uint8_t i = select; static_cmd[i].fp != NULL; i++) { static_cmd[i].fp = static_cmd[i+1].fp; } }
|簡單調用
int main() { handle(); printf(" "); push(shell_test_fp); printf(" "); handle(); printf(" "); free(1); printf(" "); handle(); while (1) { /* code */ } }
|查看結果
表驅在項目中很常見,適當使用能有效提高代碼的可讀性,也方便后期維護的迭代!
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
驅動
+關注
關注
12文章
1844瀏覽量
85351 -
C語言
+關注
關注
180文章
7608瀏覽量
137084 -
編程
+關注
關注
88文章
3627瀏覽量
93807 -
源碼
+關注
關注
8文章
645瀏覽量
29273 -
命令行
+關注
關注
0文章
78瀏覽量
10404
原文標題:C語言|表驅動
文章出處:【微信號:玩轉單片機,微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
請問一下,用AVR studio 5如何用C語言表達attiny85的進入睡眠?
請問一下,用AVR studio 5如何用C語言表達attiny85的進入睡眠?同時用在tkstudio軟件下,都用-sleep()也都不行的,怎么解決呢?
發表于 11-24 11:34
C語言指針詳解
];//指針的類型是 int(*)[3] (5)int*(*ptr)[4];//指針的類型是int*(*)[4] 怎么樣?找出指針的類型的方法是不是很簡單? 完整的C語言指針詳解pdf格式文檔電子發燒友下載地址(共12
發表于 07-04 03:34
基于性別的暴力(GBV)的語言表達如何影響責任認知
不同的語言表達可以通過強調某些部分從不同的角度來概念化同一事件。該論文調查了一個具有社會后果的案例:基于性別的暴力(GBV)的語言表達如何影響責任認知。
評論