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" },
如果一个函数处理函数可以处理多个状态,这很方便。