2012-12-13 82 views
0

This question詢問有限狀態機有100個狀態,每個狀態有100個事件,然後做一個簡短的比較,使用語句或函數指針來實現狀態機。帶有函數指針的狀態機:如何設置函數指針?

我的問題是:如果使用函數指針,函數指針應該如何設置?用if-elseswitch聲明(在這種情況下,函數指針是否更像是混合解決方案)?或者還有另外一種這樣做的方式嗎?

回答

1

你可以做類似如下:

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指針。此外,您可以修改函數指針以獲取輸入參數。

2

我期望每個狀態都由一個函數來表示,並且所有狀態都能夠「相互認識」。

因此,設置可以直接:

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意思是「不要切換」。

1
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" }, 

如果一個函數處理函數可以處理多個狀態,這很方便。