状态机的典型实现方法:
嵌套的switch语句
状态表
面向对象的状态设计模式
枚举状态和事件
将状态和事件进行枚举:
enum sm_state
{
state1,
state2,
state3
}
enum sm_event
{
event1,
event2,
event3
}
嵌套的switch语句实现状态机
嵌套的switch可以用一维状态表来表现:
当前状态 事件 监护条件 下一状态 动作
state1 event1 check是否符合规则 event2 action1
event2 check是否符合规则 event3 action2
event3 check是否符合规则 event4 action3
state2 event1 check是否符合规则 event5 action4
event2 check是否符合规则 event6 action5
event3 check是否符合规则 event7 action6
state3 event1 check是否符合规则 event8 action7
event2 check是否符合规则 event9 action8
event3 check是否符合规则 event1 action9
第一层switch为state, 第二次switch为event:
void state_machine_process(int state, int event)
{
switch(state)
{
case state1:
{
switch(event)
case event1:
case event2:
case event3:
}
case state2:
{
switch(event)
case event1:
case event2:
case event3:
}
}
}
缺点:
不促进代码复用;
随着状态和事件的增多,状态机容易变得非常长;
非层次式。
数组查表实现状态机
使用一个2维状态表,在水平方向罗列事件,在竖直方向罗列状态。
event1 event2 event3
state1 action1 action2 action3
state2 action4 action5 action6
state3 action7 action8 action9
可使用二维函数指针数组将其表现,数组成员为state和event下的处理函数指针:
typedef void (*SM_FUN) (int, int);
SM_FUN state_machine[3][3]
{
{
{(SM_FUN)action1},
{(SM_FUN)action2},
{(SM_FUN)action3}
},
{
{(SM_FUN)action4},
{(SM_FUN)action5},
{(SM_FUN)action6}
},
{
{(SM_FUN)action7},
{(SM_FUN)action8},
{(SM_FUN)action9}
}
}
当使用时,可以根据当前的state和event进行查表,选择对应的处理函数:
*state_machine[state2][evnet2](state2, event2);
————————————————
版权声明:本文为CSDN博主「Chen_Hulk」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010034085/article/details/119303695