函数指针方法怎么实现简单状态机
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,本篇内容主要讲解"函数指针方法怎么实现简单状态机",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"函数指针方法怎么实现简单状态机"吧!状态机简介有限状态机FS
千家信息网最后更新 2025年02月02日函数指针方法怎么实现简单状态机
本篇内容主要讲解"函数指针方法怎么实现简单状态机",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"函数指针方法怎么实现简单状态机"吧!
状态机简介
有限状态机FSM是有限个状态及在这些状态之间的转移和动作等行为的数学模型,是一种逻辑单元内部的高效编程方法,可以根据不同状态或者消息类型进行相应的处理逻辑,使得程序逻辑清晰易懂。
函数指针实现FSM
使用函数指针实现FSM可以分为3个步骤
鸿蒙官方战略合作共建--HarmonyOS技术社区
建立相应的状态表和动作查询表
根据状态表、事件、动作表定位相应的动作处理函数
执行完成后再进行状态的切换
代码实现步骤
1.定义状态数据的枚举类型
typedef enum { state_1=1, state_2, state_3, state_4 }State;
2.定义事件的枚举类型
typedef enum{ event_1=1, event_2, event_3, event_4, event_5 }EventID;
3.定义状态表的数据类型
typedef struct { int event; //事件 int CurState; //当前状态 void (*eventActFun)(); //函数指针 int NextState; //下一个状态 }StateTable;
4.定义处理函数及建立状态表
void f121() { printf("this is f121\n"); } void f221() { printf("this is f221\n"); } void f321() { printf("this is f321\n"); } void f122() { printf("this is f122\n"); } StateTable fTable[] = { //{到来的事件,当前的状态,将要要执行的函数,下一个状态} { event_1, state_1, f121, event_2 }, { event_2, state_2, f221, event_3 }, { event_3, state_3, f321, event_4 }, { event_4, state_4, f122, event_1 }, //add your code here };
5.状态机类型,及状态机接口函数
/*状态机类型*/ typedef struct { int curState;//当前状态 StateTable * stateTable;//状态表 int size;//表的项数 }fsmType; /*状态机注册,给它一个状态表*/ void fsmRegist(fsmType* pFsm, StateTable* pTable) { pFsm->stateTable = pTable; } /*状态迁移*/ void fsmStateTransfer(fsmType* pFsm, int state) { pFsm->curState = state; } /*事件处理*/ void fsmEventHandle(fsmType* pFsm, int event) { StateTable* pActTable = pFsm->stateTable; void (*eventActFun)() = NULL; //函数指针初始化为空 int NextState; int CurState = pFsm->curState; int maxNum = pFsm->size; int flag = 0; //标识是否满足条件 /*获取当前动作函数*/ for (int i = 0; i附代码
代码直接复制过去就行啦,本想打包的,太麻烦了。
测试程序
//编译器:http://www.dooccn.com/cpp/ //来源:技术让梦想更伟大 //作者:李肖遥 #includetypedef enum { state_1=1, state_2, state_3, state_4 }State; typedef enum{ event_1=1, event_2, event_3, event_4, event_5 }EventID; typedef struct { int event; //事件 int CurState; //当前状态 void (*eventActFun)(); //函数指针 int NextState; //下一个状态 }StateTable; void f121() { printf("this is f121\n"); } void f221() { printf("this is f221\n"); } void f321() { printf("this is f321\n"); } void f122() { printf("this is f122\n"); } StateTable fTable[] = { //{到来的事件,当前的状态,将要要执行的函数,下一个状态} { event_1, state_1, f121, event_2 }, { event_2, state_2, f221, event_3 }, { event_3, state_3, f321, event_4 }, { event_4, state_4, f122, event_1 }, //add your code here }; /*状态机类型*/ typedef struct { int curState;//当前状态 StateTable * stateTable;//状态表 int size;//表的项数 }fsmType; /*状态机注册,给它一个状态表*/ void fsmRegist(fsmType* pFsm, StateTable* pTable) { pFsm->stateTable = pTable; } /*状态迁移*/ void fsmStateTransfer(fsmType* pFsm, int state) { pFsm->curState = state; } /*事件处理*/ void fsmEventHandle(fsmType* pFsm, int event) { StateTable* pActTable = pFsm->stateTable; void (*eventActFun)() = NULL; //函数指针初始化为空 int NextState; int CurState = pFsm->curState; int maxNum = pFsm->size; int flag = 0; //标识是否满足条件 /*获取当前动作函数*/ for (int i = 0; i 编译结果
到此,相信大家对"函数指针方法怎么实现简单状态机"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
状态
函数
事件
指针
动作
类型
方法
处理
条件
代码
逻辑
内容
技术
数据
有限
标识
步骤
程序
项数
学习
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全技术的重要性体现
文件保存在数据库
南京科技职业学院网络技术
苹果系统服务器验证失败
中国互联网科技发展的不足
plsql连接多个服务器
万方的中国科技成果数据库
国产服务器应用测试
软件开发公司的游戏
寻求红包软件开发
深圳行业软件开发服务费
网络安全工程师 培训班
2022希望之村服务器没了
数据库如何做性能有话
无法ea服务器
徐汇区微型软件开发有哪些
数据库sql注入攻击
企业党性体检软件开发
视频保存用什么数据库
sql取字段中一部分数据库
服务器管理员有二级蓄力吗
组织群众开展网络安全宣传
软件开发第三方评审
网络技术学习技巧
认知网络安全演讲
软件开发系统需求分析模板
德普软件开发上海公司
手机app软件开发免费
数据库应用的简单实例
乐高编程软件开发者模式