有限状态机C语言实现

来源:互联网 发布:数据脱敏规则 编辑:程序博客网 时间:2024/06/11 11:57

有限状态机(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