2012-12-13 59 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" }, 

如果一个函数处理函数可以处理多个状态,这很方便。