有限状态机C语言实现

来源:互联网 发布:数据脱敏规则 编辑:程序博客网 时间:2024/05/30 04:29

有限状态机(FSM)是设计和实现事件驱动程序内复杂行为组织原则的有力工具。

设计思路:

(1)用函数指针表示状态;

(2)函数指针函数接收事件(EVENT),根据(EVENT)决定下个状态;

(3)函数指针函数返回下个状态的函数指针。

利用强制类型转换,实现函数指针函数的原型。

#include <stdio.h>typedef void (*state_ret)(int event);typedef state_ret (*state)(int event);// 申明状态函数state_ret STATE1(int event);state_ret STATE2(int event);state_ret STATE3(int event);// 事件列表enum EVENT_NUM {    EVENT1,    EVENT2,    EVENT3,    EVENT4,};int main(void) {int i;int event;state curState = STATE1; for (i = 0; i < 5; i++) {switch(i % 5) {case 0: event = EVENT1; break;case 1: event = EVENT2; break;case 2: event = EVENT3; break;case 3: event = EVENT4; break;case 4: event = EVENT2; break;default: break;}// 运行当前状态函数,返回下一状态函数指针curState = (state)curState(event);}return 0;}// 状态1函数实现state_ret STATE1(int event) {printf("Current state is STATE1, event = %d\n", event + 1);// 设置当前状态state_ret curState = (state_ret)STATE1;switch(event) {case EVENT1: curState = (state_ret)STATE2; break;case EVENT3: curState = (state_ret)STATE3; break;default: break;}return curState;}// 状态2函数实现state_ret STATE2(int event) {printf("Current state is STATE2, event = %d\n", event + 1);  state_ret curState = (state_ret)STATE2;  switch(event){case EVENT2: curState = (state_ret)STATE1; break;default: break;}return curState;}// 状态3函数实现state_ret STATE3(int event) {printf("Current state is STATE3, event = %d\n", event + 1);state_ret curState = (state_ret)STATE3;switch(event) {case EVENT4: curState = (state_ret)STATE2; break;default: break;}return curState;}
输出:

wang@wang:~/c$ ./a.out
Current state is STATE1, event = 1
Current state is STATE2, event = 2
Current state is STATE1, event = 3
Current state is STATE3, event = 4
Current state is STATE2, event = 2

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩子在幼儿园内向老尿裤子怎么办 五岁宝宝总是抽鼻子有黄鼻涕怎么办 2岁宝宝头有大人的那么大怎么办 一岁四个月宝宝不理人不说话怎么办 两岁七个月还不会说话怎么办 2岁3个月宝宝说话结巴怎么办 两周的宝宝突然说话结巴怎么办 宝宝3岁半了说话口吃怎么办? 四十天的宝宝吐奶严重怎么办 宝宝吐奶从鼻子喷出来怎么办 六个多月宝宝吐奶一股酸味怎么办 50天的宝宝吃了就吐怎么办 微信语音群聊超过9人怎么办 四个月宝宝母乳不够不喝奶粉怎么办 四个月的宝宝母乳不够吃怎么办 火山直播十多天了还都是假人怎么办 吉利汽车锁了后屁股灯还亮怎么办 六个月凶了他突然不说话了怎么办 微信聊天聊的时间长了没话题怎么办 群聊同学加我微信不想加怎么办? 翡翠销售遇到不说话的客人怎么办 4个月宝宝吃手上瘾怎么办 宝宝吃手上瘾拒绝吃奶粉吃奶怎么办 2岁宝宝特别粘人爱哭怎么办 3岁半宝宝突然说话口吃怎么办 2岁3个月宝宝突然说话结巴怎么办 一位特爱说话爱玩的高中生怎么办 猫5天不吃不喝躲起来该怎么办 两个月的小家猫睡觉要黏人睡怎么办 成年的儿子不听话做父母要怎么办 听到孩子上课又不听话想揍他怎么办 18个月小孩脾气很犟怎么办 烦自己的孩子想弄死他怎么办 楼道经常有小孩在门口恶作剧怎么办 2岁宝宝咳嗽咳吐了怎么办 不小心把鱼刺吃下去该怎么办 儿子在学校被老师甩耳光我该怎么办 家长诬陷老师打她家孩子耳光怎么办 一岁宝宝总觉得有痰怎么办 一岁宝宝感冒咳嗽有痰怎么办 哭的时候踹不过气来应该怎么办