This question詢問有限狀態機有100個狀態,每個狀態有100個事件,然後做一個簡短的比較,使用語句或函數指針來實現狀態機。帶有函數指針的狀態機:如何設置函數指針?
我的問題是:如果使用函數指針,函數指針應該如何設置?用if-else
或switch
聲明(在這種情況下,函數指針是否更像是混合解決方案)?或者還有另外一種這樣做的方式嗎?
This question詢問有限狀態機有100個狀態,每個狀態有100個事件,然後做一個簡短的比較,使用語句或函數指針來實現狀態機。帶有函數指針的狀態機:如何設置函數指針?
我的問題是:如果使用函數指針,函數指針應該如何設置?用if-else
或switch
聲明(在這種情況下,函數指針是否更像是混合解決方案)?或者還有另外一種這樣做的方式嗎?
你可以做類似如下:
typedef int (*current_state) (void);
typedef int (*nextnew_state) (void);
struct FuncPointerState
{
current_state curr_state;
nextnew_state next_state;
};
/*init_state is the initial function state*/
struct FuncPointerState FpState = {init_state, NULL};
int iRet = 0;
while(1)
{
iRet = FpState.curr_state();
if(iRet<= 0)
{
return iRet;
}
if(NULL==FpState.next_state)
{
/* State Machine finished it's job */
break;
}
FpState.curr_state = FpState.next_state;
}
每個狀態函數應該填充next_state指針。此外,您可以修改函數指針以獲取輸入參數。
我期望每個狀態都由一個函數來表示,並且所有狀態都能夠「相互認識」。
因此,設置可以直接:
void set_state(void (*state)(void))
{
the_current_state = state;
}
void state_idle(void)
{
printf("oh, hai, boring to be in the idle state, let's switch\n");
set_state(state_busy);
}
這個假設當前的狀態是通過一個全局函數指針(the_current_state
)爲藍本。
你當然也可以讓每個狀態返回新的狀態,或者可能是NULL
意思是「不要切換」。
struct state_fn {
void (*handler)(void);
};
static int state;
static struct state_fn[MAX_STATE] = {
{ .handler = handler_state_0, },
{ .handler = handler_state_1, },
{ .handler = handler_state_2, },
};
然後調用state_fn [state] - > handler();
您可以從結構中選擇性地添加參數。像這樣:
struct state_fn {
void (*handler)(void *data);
void *data;
}
然後調用state_fn [狀態] - >處理設備(state_fn [狀態] - >數據);
{ .handler = handler_state_0, .data = "blabla" },
如果一個函數處理函數可以處理多個狀態,這很方便。