重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

函数指针方法怎么实现简单状态机

本篇内容主要讲解“函数指针方法怎么实现简单状态机”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“函数指针方法怎么实现简单状态机”吧!

十多年的原州网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整原州建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联公司从事“原州网站设计”,“原州网站推广”以来,每个客户项目都认真落实执行。

状态机简介

有限状态机FSM是有限个状态及在这些状态之间的转移和动作等行为的数学模型,是一种逻辑单元内部的高效编程方法,可以根据不同状态或者消息类型进行相应的处理逻辑,使得程序逻辑清晰易懂。

函数指针实现FSM

使用函数指针实现FSM可以分为3个步骤

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 建立相应的状态表和动作查询表

  3. 根据状态表、事件、动作表定位相应的动作处理函数

  4. 执行完成后再进行状态的切换

代码实现步骤

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/ //来源:技术让梦想更伟大 //作者:李肖遥 #include   typedef 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

编译结果

函数指针方法怎么实现简单状态机

到此,相信大家对“函数指针方法怎么实现简单状态机”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


网站题目:函数指针方法怎么实现简单状态机
URL标题:http://cqcxhl.com/article/ppjcdi.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP