文件名称:层次式状态处理函数-《中国2060年前碳中和研究报告》
文件大小:4.49MB
文件格式:PDF
更新时间:2024-06-28 01:03:09
UML 状态图 实用C设计 实用C++设计 中文全文
4.4 层次式状态处理函数 在 QEP,状态被表示为状态处理函数,处理由它们实现的状态的全部事件。层次式状态处理函数使用完 全一致的格式 QStateHandler ,和在第三章 3.6 节的非层次式状态处理函数一样。它们对我们前面讨论 的非层次式状态处理函数唯一的扩展是,一个层次式状态处理函数必须特别通知事件处理器有关状态嵌 套层次的信息。当这个层次式状态处理函数不处理这个事件,它必须提供一个超状态,这样事件处理器 可以根据状态嵌套的语义调用超状态的处理函数(见第2.3.2节)。层次式状态处理函数提供这个特别的 信息给事件处理器非常类似它通知事件处理器有关一个状态转换的情况。状态处理函数把状态变量给超 状态处理函数并返回一个特定的状况信息,从而把状态处理和状态迁移区分开来。 4.4.1 标识超状态 ( 宏 Q_SUMPER()) 当一个层次式状态处理函数不处理当前的事件,它返回一个宏 Q_SUPER( )给事件处理器,定义如下: #define Q_RET_SUPER ((QState)3) #define Q_SUPER(super_) \ (((QHsm *)me)->state = (QStateHandler)(super_), Q_RET_SUPER) 宏Q_SUPER( )被定义为使用逗号表达式。一个逗号表达式从左到右被计算,整个表达式的类型和 值是在最右边的操作数。在这里,最右边的操作数是操作的状况(超状态),它从状态处理函数返回。 这个设计的关键在于宏 Q_SUPER( )能被用于从 QHsm 派生(继承)的结构,这样在 C 语言里需要一 个显式的从 QHsm 基础结构的转换(向上转换),(见第一章边栏“ C 语言里的单一继承”)。 4.4.2 C 语言实现的层次式状态处理函数 清单 4.4 展示了一个对应于在图 2.19 的计算器状态图的状态 ini1 的层次式状态处理函数的实例。状 态 int1 控制输入第一个操作数的整数部分。 清单 6 一个 C语言的层次式状态处理函数 ( 文件 calc.c) (1) QState Calc_int1(Calc *me, QEvent const *e) { (2) switch (e->sig) { (3) case DIGIT_0_SIG: /* intentionally fall through */ (4) case DIGIT_1_9_SIG: { (5) BSP_insert(((CalcEvt const *)e)->key_code); (6) return Q_HANDLED(); } case POINT_SIG: { BSP_insert(((CalcEvt const *)e)->key_code); (7) return Q_TRAN(&Calc_frac1); 保留中文简体翻译的全部版权 anymcu@gmail.com 2010 123