C函数指针状态机实现
2024-08-29 21:55:37
C函数指针状态机实现
有限状态机(finite state machine)简称FSM,表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用。FSM是一种逻辑单元内部的一种高效编程方法,在服务器编程中,服务器可以根据不同状态或者消息类型进行相应的处理逻辑,使得程序逻辑清晰易懂。
#include <stdio.h> //函数指针实现FSM enum year_state { SPRING = , SUMMER, AUTUMN, WINTER }; enum year_event { EVENT1 = , EVENT2, EVENT3, EVENT4 }; typedef struct FsmTable_s { int event; // 事件 int CurState; // 当前状态 void (*eventActFun)(); //函数指针 int nextState; // 下一个状态 } FsmTable_t; void spring_thing() { printf("this is spring\n"); } void summer_thing() { printf("this is summer\n"); } void autumn_thing() { printf("this is autumn\n"); } void winter_thing() { printf("this is winter\n"); } FsmTable_t year_table[] = { //{到来的事件,当前的状态,将要要执行的函数,下一个状态} { EVENT1, SPRING, summer_thing, SUMMER }, { EVENT2, SUMMER, autumn_thing, AUTUMN }, { EVENT3, AUTUMN, winter_thing, WINTER }, { EVENT4, WINTER, spring_thing, SPRING }, //add your codes here }; typedef struct FSM_s { int curState;//当前状态 FsmTable_t * pFsmTable;//状态表 int size;//表的项数 } FSM_t; /*状态机注册,给它一个状态表*/ void FSM_Regist(FSM_t *pFSM, FsmTable_t *pFsmTable) { pFSM->pFsmTable = pFsmTable; } /*状态迁移*/ void FSM_StateTransfer(FSM_t* pFsm, int state) { pFsm->curState = state; } /*事件处理*/ void FSM_EventHandle(FSM_t* pFsm, int event) { FsmTable_t* pActTable = pFsm->pFsmTable; void (*eventActFun)() = NULL; //函数指针初始化为空 int NextState; int CurState = pFsm->curState; int g_max_num = pFsm->size; ; //标识是否满足条件 int i; ; i < g_max_num; i++) { if (event == pActTable[i].event && CurState == pActTable[i].CurState) { flag = ; eventActFun = pActTable[i].eventActFun; NextState = pActTable[i].nextState; break; } } if (flag) { if (eventActFun) { eventActFun(); } FSM_StateTransfer(pFsm, NextState); } else { printf("There is no match\n"); } } int main() { FSM_t year_fsm; FSM_Regist(&year_fsm, year_table); year_fsm.curState = SPRING; year_fsm.size = sizeof(year_table)/sizeof(FsmTable_t); printf("\n-------1--init spring------\n"); printf("state:%d\n",year_fsm.curState); printf("\n-------2--spring->summer------\n"); FSM_EventHandle(&year_fsm,EVENT1); printf("state:%d\n",year_fsm.curState); printf("\n-------3--summer->autumn------\n"); FSM_EventHandle(&year_fsm,EVENT2); printf("state:%d\n",year_fsm.curState); printf("\n-------4--autumn->winter------\n"); FSM_EventHandle(&year_fsm,EVENT3); printf("state:%d\n",year_fsm.curState); printf("\n-------5--winter->spring------\n"); FSM_EventHandle(&year_fsm,EVENT4); printf("state:%d\n",year_fsm.curState); printf("\n-------6--receive EVENT2 not EVENT1------\n"); FSM_EventHandle(&year_fsm,EVENT2); printf("state:%d\n",year_fsm.curState); }
最新文章
- golang坑1
- 大熊君大话NodeJS之开篇------Why NodeJS(将Javascript进行到底)
- iOS之github第三方框架(持续更新)
- PHPSESSID的cookie
- cloudera目录位置
- WebApi 自定义过滤器实现支持AJAX跨域的请求
- echarts 某省下钻某市地图
- 分享非常好用的前端分页js工具类 灵活 简单易懂
- .Net Linq与Lambda表达式中GroupBy以多个字段分组
- CMakeList.txt(1):cmake error
- Service-Level Agreement (服务水平协议)
- 纯CSS3完成选项卡,不要js完成的选项卡
- C#中MessageBox.Show问题(让提示窗口不显示在任务栏中)
- Java桌面程序打包成exe可执行文件
- codeforces水题100道 第十九题 Codeforces Round #109 (Div. 2) A. I_love_%username% (brute force)
- (13/24) css进阶:自动处理css3属性前缀
- BETA-1
- 一道非常易错的js面试题
- OpenCV---直方图的应用(均衡化和图像比较)
- Winter-2-STL-C Where is the Marble? 解题报告及测试数据