Utilize function pointers to build Handlers

有時候因為 Event 過多,不想寫太多 Switch case 或是 if … else,我們可以想個辦法 (學習晶片廠的施工方法) 整理成 table 的形式,方便維護。

#define COMMAND_A 1

#define COMMAND_B 2

int demo_funcA(int, uint8_t); // handle function 要呼叫的

int demo_funcB(int, uint8_t);

typedef int (*cmd_handler)(int,uint8_t); //要呼叫的 function,及要傳入的參數

typedef struct cmd_handler_entry{

int command;

cmd_handler handler;

}cmd_handler_entry;

/*

重點在這邊可以做成 table 的形式,後續維護很方便,不過要注意傳入參數的型態

*/

static cmd_handler_entry cmd_handler_entries[] = {

{ COMMAND_A, demo_funcA},

{ COMMAND_B, demo_funcB},

{ NULL, NULL}

};

int main(){

//在這函式中,需要下 COMMAND_B,並執行它對應的函數

cmd_handler_entry* msg_handler;

msg_handler = cmd_handler_entries;

while(msg_handler->handler != NULL){

if(msg_handler->command == COMMAND_B){

break;

}else{

msg_handler++;

}

}

if(msg_handler->handler != NULL){

//需要下 COMMAND_B

msg_handler->command = COMMAND_B;

// handler 會自動指向它的函式:demo_funcB,並傳入參數(123, ‘0x123’)

msg_handler->handler(123, ‘0x123’);

return 1;

}else{

printf(“Handler ERROR!”);

return 0;

}

}

Last updated