




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
分类:本文讲述层次状态机实现形式中的行为继承。从行为继承与类继承之间的OO类相似来看,一个成功的层次状态机应该能够模拟下列属于C+对象模型。使用和维护简单应允许转态机拓扑容易改变,不应要求转换连接的人工代码,所需要的修改限制在代码的一个地方。提供好的运行-时间效率和小的存储。遵守C+中的“零额外开销”原则。为了满足上面的要求,层次状态机的实现着重于下面的主要元素:完全支持行为继承的层次关系用状态进入和退出动作实现有保证得初始化和清除通过类继承支持规定的状态模型1.基本要素(1)状态:在层次状态的情形下,状态处理器必须返回朝状态,这导致层次状态处理特征标记的递归定义。构造这种特征标记在C+是不可能的,于是定义下面宏来近似:typedefvoid(* QPseudoState)(QEVENTconst*pEvent);typedefQPseudoState (* QState)(QEVENTconst*pEvent);(2)进入/退出动作和初始状态:这些元素是状态专有的特征,在转态中他们被定义,而特别的是与到达状态所进过的路径无关。保留信号的转态定义为:typedefenumtagQSIGQ_EMPTY_SIG = 1,Q_INIT_SIG,Q_ENTRY_SIG,Q_EXIT_SIG,Q_USER_SIG, QSIG;状态处理机可以用一般的switch语句规定适当的用例处理这些信号,可以自由的执行相应信号的操作。(3)状态转换:状态处理机用Q_TRAN实现状态转换,并且在原状态的上下文中执行动作,即:改变状态之前调用Q_TRAN(和UML规定不一致)。#defineQ_TRAN(target_) Q_TranDyc(QState)(target_)(4)Top状态和初始伪状态:每个层次状态机都有一个Top状态,包括整个状态的所有其它元素。Top状态没有超状态,用户也不能覆盖;Top状态的唯一目的是提供状态层次的最高的根,使最高处理器能返回Top; Top状态唯一能订制的是初始化。初始化伪状态处理机仅规定初始化转换,必须指明被窃套的Top状态的状态机的缺省状态。2.实现代码:(1)头文件代码:#ifndefSTATE_INHERIT_H#defineSTATE_INHERIT_HtypedefunsignedshortQSIG;/ Define the signal of state machineenumQ_EMPTY_SIG = 0,Q_INIT_SIG = 1,Q_ENTRY_SIG,Q_EXIT_SIG,Q_USER_SIG;/ Define the signal of state machinetypedefstructtagQEVENTQSIG sig;unsignedchar*pEvent1;unsignedchar*pEvent2;/ TODO: add fields to the event QEVENT;/ define state data typetypedefvoid(* QPseudoState)(QEVENTconst*pEvent);typedefQPseudoState (* QState)(QEVENTconst*pEvent);typedefQPseudoState QSTATE;#defineQ_TRIGGER(state, sig) (QState)(*(state)(QEVENT*)&pkgStdEvtsig)/ define a transation that dont change the state,/ just treat the pEvent with the target state./ this is used by concurrent state#defineQ_INIT(target_) Init_(QState)(target_);#defineQ_TRAN(target_) Q_TranDyc(QState)(target_);voidInit_(QState target);voidQ_Init(QSTATE target);voidQ_Initial(QEVENTconst* pQevt);voidQ_Dispatch(QEVENTconst* pQevt);voidQ_TranDyc(QState target);#endif/STATE_INHERIT_H(2)实体代码:#include#include#includestate_inherit.hstaticQState srcState;/ source statestaticQState actState;/ active statestaticQEVENTconstpkgStdEvt =Q_EMPTY_SIG, 0, 0,Q_INIT_SIG, 0, 0,Q_ENTRY_SIG, 0, 0,Q_EXIT_SIG, 0, 0;voidQ_Initial(QEVENTconst* pQevt)printf(Top_Init;);voidQ_Dispatch(QEVENTconst* pQevt)for(srcState = actState; srcState;srcState = (QState)(*srcState)(pQevt)voidInit_(QState target)actState = target;voidQ_Init(QSTATE target)registerQState s;actState = (QState)target;srcState = (QState)Q_Initial;s = actState;/ save actState in a temporary(*(QPseudoState)srcState)(QEVENT*)0);/ top-most initial tran./ initial transition must go one level deeps = actState;/ update the temporaryQ_TRIGGER(s, Q_ENTRY_SIG);/ enter the statewhile(0 = Q_TRIGGER(s, Q_INIT_SIG)/ init handled/ initial transition must go one level deeps = actState;Q_TRIGGER(s, Q_ENTRY_SIG);/ enter the substatevoidQ_TranDyc(QState target)QState entry8, p, q, s, *e, *lca;for(s = actState; s != srcState; )QState t;t = Q_TRIGGER(s, Q_EXIT_SIG);if(t)/ exit action unhandled, t points to superstates = t;else/ exit action handled, elicit superstates = Q_TRIGGER(s, Q_EMPTY_SIG);*(e = &entry0) = 0;*(+e) = target;/ assume entry to target/ (a) check source = target (transition to self)if(srcState = target)Q_TRIGGER(srcState, Q_EXIT_SIG);/ exit sourcegotoinLCA;/ (b) check source = target-superp = Q_TRIGGER(target, Q_EMPTY_SIG);if(srcState = p)gotoinLCA;/(c) check source-super = target-super (most common)q = Q_TRIGGER(srcState, Q_EMPTY_SIG);if(q = p)Q_TRIGGER(srcState, Q_EXIT_SIG);/ exit sourcegotoinLCA;/ (d) check source-super = targetif(q = target)Q_TRIGGER(srcState, Q_EXIT_SIG);/ exit source-e;/ not enter the LCAgotoinLCA;/ (e) check rest of source = target-super-super. hierarchy*(+e) = p;for(s = Q_TRIGGER(p, Q_EMPTY_SIG); s; s = Q_TRIGGER(s, Q_EMPTY_SIG)if(srcState = s)gotoinLCA;*(+e) = s;Q_TRIGGER(srcState, Q_EXIT_SIG);/ exit source/ (f) check rest of source-super = target-super-super.for(lca = e; *lca; -lca)if(q = *lca)e = lca - 1;/ do not enter the LCAgotoinLCA;/ (g) check each srcState-super-super.for each target.for(s = q; s; s = Q_TRIGGER(s, Q_EMPTY_SIG)for(lca = e; *lca; -lca)if(s = *lca)e = lca - 1;/ do not enter the LCAgotoinLCA;Q_TRIGGER(s, Q_EXIT_SIG);/ exit sassert(0);/ malformed HSMinLCA:/ now we are in the LCA of srcState and targetassert(e &entrysizeof(entry) /sizeof(*entry);/ entry fitswhile(s = *e-)/ retrace the entry path in reverse orderQ_TRIGGER(s, Q_ENTRY_SIG);/ enter sactState = target;/ update current statewhile(0 = Q_TRIGGER(target, Q_INIT_SIG)/ initial transition must go one level deepassert(target = Q_TRIGGER(actState, Q_EMPTY_SIG);target = actState;Q_TRIGGER(target, Q_ENTRY_SIG);/ enter target3.范例:(1)范例状态图(2)范例代码#include#includestate_inherit.hQSTATE s0(QEVENTconst*e);QSTATE s1(QEVENTconst*e);QSTATE s2(QEVENTconst*e);QSTATE s11(QEVENTconst*e);QSTATE s21(QEVENTconst*e);QSTATE s211(QEVENTconst*e);QSTATE Q_Top(QEVENTconst*e);staticvoidInitial(QEVENTconst*e);staticboolbFoo;enumQSignals A_SIG = Q_USER_SIG,B_SIG, C_SIG, D_SIG, E_SIG, F_SIG, G_SIG, H_SIG;staticconstQEVENT testQEvt =A_SIG, 0, 0, B_SIG, 0, 0, C_SIG, 0, 0, D_SIG, 0, 0,E_SIG, 0, 0, F_SIG, 0, 0, G_SIG, 0, 0, H_SIG, 0, 0;intmain()printf(Hiberarchy state machine testingn);Initial(0);/ trigger initial transitionfor(;)charc;printf(nSignal-);c = getc(stdin);getc(stdin);/ discard nif(c a | h sig)caseQ_ENTRY_SIG: printf(s0-ENTRY;);return0;caseQ_EXIT_SIG: printf(s0-EXIT;);return0;caseQ_INIT_SIG: printf(s0-INIT;); Q_INIT(s1);return0;caseE_SIG:printf(s0-E;); Q_TRAN(s211);return0;return(QSTATE)Q_Top;QSTATE s1(QEVENTconst*e) switch(e-sig) caseQ_ENTRY_SIG: printf(s1-ENTRY;);return0;caseQ_EXIT_SIG: printf(s1-EXIT;);return0;caseQ_INIT_SIG: printf(s1-INIT;);Q_INIT(s11);return0;caseA_SIG:printf(s1-A;);Q_TRAN(s1);return0;caseB_SIG:printf(s1-B;);Q_TRAN(s11);return0;caseC_SIG:printf(s1-C;);Q_TRAN(s2);return0;caseD_SIG:printf(s1-D;);Q_TRAN(s0);return0;caseF_SIG:printf(s1-F;);Q_TRAN(s211);return0;return(QSTATE)s0;QSTATE s11(QEVENTconst*e) switch(e-sig) caseQ_ENTRY_SIG: printf(s11-ENTRY;);return0;caseQ_EXIT_SIG:printf(s11-EXIT;);return0;caseG_SIG:printf(s11-G;); Q_TRAN(s211);return0;caseH_SIG:/ internal transition with a guardif(bFoo)/ test the guard conditionprintf(s11-H;);bFoo =false;return0;break;return(QSTATE)s1;QSTATE s2( QEVENTconst*e) switch(e-sig) caseQ_ENTRY_SIG: printf(s2-ENTRY;);return0;caseQ_EXIT_SIG: printf(s2-EXIT;);return0;caseQ_INIT_SIG: printf(s2-INIT;);Q_INIT(s21);return0;caseC_SIG:printf(s2-C;);Q_TRAN(s1);return0;caseF_SIG:printf(s2-F;);Q_TRAN(s11);return0;return(QSTATE)s0;QSTATE s21(QEVENTconst*e) switch(e-sig) caseQ_ENTRY_SIG: printf(s21-ENTRY;);return0;caseQ_EXIT_SIG: printf(s21-EXIT;);return0;caseQ_INIT_SIG:printf(s21-INIT;);Q_INIT(s211);return0;caseB_SIG:printf(s21-C;);Q_TRAN(s211);return0;caseH_SIG:/ self transition with a guardif(!bFoo)/ test the guard conditionprintf(s21-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 金融科技在消费领域资源配置中的角色
- 消费升级背景下的融资模式创新
- 文化体制改革中的地方政府角色探析
- 深化工业园区改革创新的面临的问题、机遇与挑战
- 2025年装配式建筑施工员职业技能认证模拟试卷(装配式建筑施工技术)-装配式建筑装配式构件质量与安全
- 抽水蓄能对电力安全保障的贡献分析
- 2025汽车销售合同范文
- 基于大数据的医学教育个性化发展
- 中秋节品牌营销策略
- 动物世界解析
- 2024年陕西省西安市中考地理试题卷(含答案逐题解析)
- 2024年汽车驾驶员(技师)证考试题库附答案
- 辛亥革命胜利的历史意义及其局限性
- 化学高考考前指导讲座
- 新疆维吾尔自治区2024年普通高考第三次适应性检测(三模)英语试卷(含答案详解)
- 2023-2024学年全国初中一年级下历史人教版期末试卷(含答案解析)
- 2024京东代运营服务合同范本
- 海上风电柔性直流输电系统先进控制技术分析报告
- 2024届四川省泸州市龙马潭区六年级语文小升初摸底考试含答案
- 三年级语文下册 期末综合模拟测试卷(人教浙江版)
- 尿培养的健康宣教
评论
0/150
提交评论