c语言不用switch状态机,switch状态机 - 单片机/MCU论坛 - 电子技术论坛 - 广受欢迎的专业电子论坛!...

当程序出现多个状态的时候,不能避免的会用到状态机这个东西,今天就说一下最简单的的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写法破坏了事件之间原有的关系。

所以建议大家用第二种写法,在事件中判断状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值