函數指針作爲結構體的成員

我發一個運行過的源碼。
在.h文件中,有如下代碼:

//TVM控制狀態
typedef struct _m_TVM_CTRL
{
 u32(*get_coin_totval)(void); //得到此次投入硬幣總金額
 u32(*get_coin_totcnt)(void); //得到此次投入硬幣總數目
 void(*clr_coin)(void);   //清空金額和數目,每次新投幣開始執行

 u32(*get_coin_totrval)(void);//得到此次找零的總金額
 u32(*get_coin_totrcnt)(void);//得到此次找零的硬幣總數目
 void(*clr_rcoin)(void);   //清空金額和數目,每次新找零開始執行

 void(*clr_hpx)(void);      //清空某個hp中的所有硬幣
 void(*thp_add_money)(void);  //將錢數彙總到循環找零hp中,當chg_mode爲1的時候,可以執行該函數
  u8  cur_cmd;           //當前指令 0X00,無有效指令;0X32,開始收錢;0X33,硬幣回收;0X34,找零; 
  u16 cmd_prm;         //指令參數
 u8  cmd_sta;                 //指令執行狀態
 m_HP_MESSAGE hp_msg[4];   //每個hopper的狀態信息
}m_TVM_CTRL; 
extern m_TVM_CTRL     TVM_CTRL;    //控制器

在.c文件中,有如下代碼:
//TVM主控制器      
m_TVM_CTRL     TVM_CTRL=    //控制器
{
 get_coin_totval,
 get_coin_totcnt,
 clr_coin,

 get_coin_totrval,
 get_coin_totrcnt,
 clr_rcoin,

 clr_hpx,
 thp_add_money,
  0,
 0,
 0,
 0,   
};
get_coin_totva, clr_coinl等都是在.c文件中存在的函數的函數名。
這樣,就完成了TVM_CTRL這個結構體的函數指針初始化,
接下來就可以方便應用了。
比如我要清空TVM的金額,我只需要寫:TVM_CTRL.clr_coin();即可。
又比如,我要清空某個HOPPER,只需要寫:TVM_CTRL.clr_hpx();
這樣可以及其方便的管理某些設備的各個狀態。

你可以把任何一個外設都定義爲一個結構體,然後在這個裏面包含了該外設的所有執行函數,及狀態變量。從而非常方便的控制該外設。
更好的是,一旦有任何新增功能,只需要在原來的結構體裏面塞函數或者變量就可以了。及其方便維護。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章