首页 技术 正文
技术 2022年11月16日
0 收藏 554 点赞 4,497 浏览 2322 个字

C函数指针状态机实现

有限状态机(finite state machine)简称FSM,表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用。FSM是一种逻辑单元内部的一种高效编程方法,在服务器编程中,服务器可以根据不同状态或者消息类型进行相应的处理逻辑,使得程序逻辑清晰易懂。

#include <stdio.h>//函数指针实现FSMenum 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);}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,020
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,513
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,359
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,142
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,772
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,850