惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
量子位
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
S
SegmentFault 最新的问题
Blog — PlanetScale
Blog — PlanetScale
月光博客
月光博客
Google DeepMind News
Google DeepMind News
小众软件
小众软件
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
MongoDB | Blog
MongoDB | Blog
B
Blog RSS Feed
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
B
Blog
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
Recent Announcements
Recent Announcements
Y
Y Combinator Blog
Microsoft Security Blog
Microsoft Security Blog
雷峰网
雷峰网
Jina AI
Jina AI
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园 - Jeff

4个月 POJ1019 POJ1035 POJ1007 POJ1005 ONLINE_JUDGE Linux shell定时器 怪异的grep结果 URL2FILE C primer笔记 Vxworks增加system call C语言常用宏定义技巧 分苹果 Socket 为什么选择SMP而不是AMP RTP memory in Vxworks Windriver的项目类型 RTP affinity Symmetric multiprocessing (SMP)
C++ 有限状态机
Jeff · 2012-03-08 · via 博客园 - Jeff

2012-03-08 22:10  Jeff  阅读(3718)  评论()    收藏  举报

用一个类定义事件和状态
文件:GlobalAutoDcl.h
Const int NbMaxAction =10;
Const int NbMaxState =5;
Const int NbMaxEvent =6;
Class GlobalAutoDcl{
public:
typedef enum {
event0 = 0;
event1 =1;
.......
}
typedef enum {
state0  = 0;
state1   =1;
.......
}
}
用一个抽象类定义一些数组,Action等:
文件: GlobalAuto.h
class GlobalResetAuto{
public:
protected:
//定义action的函数指针类型
typedef GlobalAutoDcl::StateForGlobalReset_t 
(GlobalAuto::*fPtr) (Signal *);
//定义一个Action的表
static fPtr ActionTable[NbMaxAction];
// 定义一个state/event的二维数组
static unsigned char Automaton[NbMaxState ][NbMaxEvent];
//二维数组的值就是Action,对应的state,event
// 定义虚函数,也就是Action函数
// 注意函数名字定义,由state和event组成,表示这个action是在此state下收到此event
virtual GlobalAutoDcl::State_t  state1_event2(Signal *msg) =0;
virtual GlobalAutoDcl::State_t  state3_event5(Signal *msg) =0;
// 此类中通常还包括如下方法定义
//  1.  返回当前state
//   2. 把当前state和event转换成字符串
//   3. ActionTable的初始化调用函数
//    4. 初始化Action数组的函数(也可以不放这里)
}
在globalauto.h文件中方法的具体实现
文件: globalauto.cpp
// 上面的state/event数组可以放在这里初始化
// Action也可以放在这里初始化
// 通常还会增加debug功能,记录过去发生的event
// 一个接收input signal的函数, 传进来的event应该包含event, 而state是本地有的
// 然后调用action中的函数指针,更改新state