[软件资料] 条件判断法实现状态机

[复制链接]
1136|5
 楼主| 小小蚂蚁举千斤 发表于 2024-6-11 13:00 | 显示全部楼层 |阅读模式
状态用 switch—case 组织起来, 将事件也用switch—case 组织起来, 然后让其中一个 switch—case 整体插入到另一个 switch—case 的每一个 case 项中  。

「示例程序  :」

  1. switch(StateVal)
  2. {
  3.     case S0:
  4.   switch(EvntID)
  5.   {
  6.    case E1:
  7.     action_S0_E1(); /*S0 状态下 E1 事件的响应*/
  8.     StateVal = new state value;/*状态迁移,不迁移则没有此行*/
  9.     break;
  10.    case E2:
  11.     action_S0_E2(); /*S0 状态下 E2 事件的响应*/
  12.     StateVal = new state value;
  13.     break;
  14.    ......
  15.    case Em:
  16.     action_S0_Em(); /*S0 状态下 Em 事件的响应*/
  17.     StateVal = new state value;
  18.     break;
  19.    default:
  20.     break;
  21.   }
  22.   break;
  23.     case S1:
  24.   ......
  25.   break;
  26.     ......
  27.     case Sn:
  28.   ......
  29.   break;
  30.     default:
  31.   break;
  32. }

上面的伪代码示例只是通用的情况,实际应用远没有这么复杂。虽然一个系统中事件可能有很多种,但在实际应用中,许多事件可能对某个状态是没有意义的。

例如在程序清单 List4中,如果 E2、······ Em 对处在 S0 状态下的系统没有意义,那么在 S0 的 case 下有关事件E2、······ Em 的代码根本没有必要写,状态 S0 只需要考虑事件 E1 的处理就行了。

既然是两个 switch—case 之间的嵌套, 那么就有一个谁嵌套谁的问题, 所以说 switch—case法有两种写法:状态嵌套事件和事件嵌套状态。这两种写法都可以, 各有利弊, 至于到底选用哪种方式就留给设计人员根据具体情况自行决断吧。

关于 switch—case 法还有最后一点要说明, 因为 switch—case 的原理是从上到下挨个比较,越靠后,查找耗费的时间就越长,所以要注意状态和事件在各自的 switch 语句中的安排顺序,不推荐示例程序清单 那样按顺序号排布的方式。出现频率高或者实时性要求高的状态和事件的位置应该尽量靠前。

AdaMaYun 发表于 2024-6-14 08:39 | 显示全部楼层
条件判断法实现状态机非常实用
小夏天的大西瓜 发表于 2024-6-17 22:56 | 显示全部楼层
状态机的作用是实现特定功能
OKAKAKO 发表于 2024-6-21 21:10 | 显示全部楼层
条件判断法实现状态机非常适合新条件的程序框架
中国龙芯CDX 发表于 2024-6-26 16:42 | 显示全部楼层
switch选择语句的状态机
jf101 发表于 2024-6-27 16:50 | 显示全部楼层
状态机原理非常简捷
您需要登录后才可以回帖 登录 | 注册

本版积分规则

228

主题

2630

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部