switch状态机
时间:10-02
整理:3721RD
点击:
当程序出现多个状态的时候,不能避免的会用到状态机这个东西,今天就说一下最简单的的switch状态机。通过switch,case来实现不同状态间的切换。以下是我总结的两种不同的结构:(c语言版)
在状态中判断事件:
cur_state=nex_state;
cur_state=nex_state;
switch(cur_state)
{
case s0://s0状态
{
if(event0)
{
//如果发生event0,则执行相关操作,执行完后,切换状态
nex_state=s0;//切换状态
}
else if(event1)
{
//如果发生event1,则执行相关操作,执行完成后,切换状态
nex_state=s1;//切换状态
}
else if(event2)
{
//如果发生event2,则执行相关操作,执行完成之后,切换状态
nex_state=s2;
}
break;
}
case s1:
if(event2)
{
//如果发生event2,则执行相关操作,执行完成之后,切换状态
nex_state=s2;
}
break;
case s2:
if(event0)
{
//如果发生event0,则执行相关操作,执行完后,切换状态
nex_state=s0;
}
break;
}
第二种:在事件中判断状态
//event0事件发生时,执行的函数
void event0_function(int * nxt_state)
{
int cur_state;
cur_state = *nxt_state;
switch(cur_state)
{
case s0:
case s2:
//执行相关操作
*nxt_state = s0;
}
}
//event1事件发生时,执行的函数
void event1_function(int * nxt_state)
{
int cur_state;
cur_state = *nxt_state;
switch(cur_state)
{
case s0:
//执行相关操作
*nxt_state = s1;
}
}
//event2事件发生时,执行的函数
void event2_function(int * nxt_state)
{
int cur_state;
cur_state = *nxt_state;
switch(cur_state)
{
case s0:
case s1:
//执行相关操作
*nxt_state = s2;
}
}
这两种写法的所实现的功能是相同的,开始的时候我喜欢用第一种写法,也就是在状态中判断事件,因为这样比较符合逻辑,顺序执行下来就可以,而且用这个来写协议解析的时候很是顺手,大家可以试试。
但是,后来发现这种写法有一个缺陷,就是这种顺序执行方式,排在前面的事件判断毫无疑问的优先于排在后面的事件判断,这种if、else写法破坏了事件之间原有的关系。
所以建议大家用第二种写法,在事件中判断状态。
在状态中判断事件:
cur_state=nex_state;
cur_state=nex_state;
switch(cur_state)
{
case s0://s0状态
{
if(event0)
{
//如果发生event0,则执行相关操作,执行完后,切换状态
nex_state=s0;//切换状态
}
else if(event1)
{
//如果发生event1,则执行相关操作,执行完成后,切换状态
nex_state=s1;//切换状态
}
else if(event2)
{
//如果发生event2,则执行相关操作,执行完成之后,切换状态
nex_state=s2;
}
break;
}
case s1:
if(event2)
{
//如果发生event2,则执行相关操作,执行完成之后,切换状态
nex_state=s2;
}
break;
case s2:
if(event0)
{
//如果发生event0,则执行相关操作,执行完后,切换状态
nex_state=s0;
}
break;
}
第二种:在事件中判断状态
//event0事件发生时,执行的函数
void event0_function(int * nxt_state)
{
int cur_state;
cur_state = *nxt_state;
switch(cur_state)
{
case s0:
case s2:
//执行相关操作
*nxt_state = s0;
}
}
//event1事件发生时,执行的函数
void event1_function(int * nxt_state)
{
int cur_state;
cur_state = *nxt_state;
switch(cur_state)
{
case s0:
//执行相关操作
*nxt_state = s1;
}
}
//event2事件发生时,执行的函数
void event2_function(int * nxt_state)
{
int cur_state;
cur_state = *nxt_state;
switch(cur_state)
{
case s0:
case s1:
//执行相关操作
*nxt_state = s2;
}
}
这两种写法的所实现的功能是相同的,开始的时候我喜欢用第一种写法,也就是在状态中判断事件,因为这样比较符合逻辑,顺序执行下来就可以,而且用这个来写协议解析的时候很是顺手,大家可以试试。
但是,后来发现这种写法有一个缺陷,就是这种顺序执行方式,排在前面的事件判断毫无疑问的优先于排在后面的事件判断,这种if、else写法破坏了事件之间原有的关系。
所以建议大家用第二种写法,在事件中判断状态。
顶一下,状态机,不错哦