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);
}

最新文章

  1. golang坑1
  2. 大熊君大话NodeJS之开篇------Why NodeJS(将Javascript进行到底)
  3. iOS之github第三方框架(持续更新)
  4. PHPSESSID的cookie
  5. cloudera目录位置
  6. WebApi 自定义过滤器实现支持AJAX跨域的请求
  7. echarts 某省下钻某市地图
  8. 分享非常好用的前端分页js工具类 灵活 简单易懂
  9. .Net Linq与Lambda表达式中GroupBy以多个字段分组
  10. CMakeList.txt(1):cmake error
  11. Service-Level Agreement (服务水平协议)
  12. 纯CSS3完成选项卡,不要js完成的选项卡
  13. C#中MessageBox.Show问题(让提示窗口不显示在任务栏中)
  14. Java桌面程序打包成exe可执行文件
  15. codeforces水题100道 第十九题 Codeforces Round #109 (Div. 2) A. I_love_%username% (brute force)
  16. (13/24) css进阶:自动处理css3属性前缀
  17. BETA-1
  18. 一道非常易错的js面试题
  19. OpenCV---直方图的应用(均衡化和图像比较)
  20. Winter-2-STL-C Where is the Marble? 解题报告及测试数据

热门文章

  1. linux初学者-NFS网络文件系统篇
  2. [机器学习] kears入门:用单层网络实现玩具回归
  3. ioc和aop理解
  4. 【python-Django开发】Django 配置MySQL数据库讲解!!!
  5. 完美解决windows10磁盘占用100%并出现卡顿、假死无反应
  6. 【POJ - 2456】Aggressive cows(二分)
  7. drf初体验
  8. eclipse的下载安装配置
  9. 02、Java的lambda表达式和JavaScript的箭头函数
  10. mui的app页面使用layui填充数据