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

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - Jeff

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

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

用一个类定义事件和状态
文件: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