zoukankan      html  css  js  c++  java
  • 编程逻辑之状态机学习

    函数指针

    • 状态机学习之前先来了解下>>函数指针学习:
    #include <stdio.h>
    
    typedef void (*pActionFun)(void);
    
    typedef enum{
        Status1=1,
        Status2,
    }CurStatus;
    
    typedef enum{
        event1=1,
        event2
    }TriggerEvent;
    
    typedef enum{
        status1=1,
        status2,
    }NextStatus;
    
    typedef struct status
    {
        CurStatus       cur_status;     //当前状态
        TriggerEvent    trigger_event;  //触发事件
        NextStatus      next_status;    //触发之后进入下一个状态
        pActionFun      act_exe;        //触发之后执行的函数
    }LogicStruct;
    
    void Act_Fun(void)
    {
        printf("Act_Fun 0x01 ! 
    ");
    }
    
    LogicStruct logic_struct = {Status1,event1,status1,Act_Fun};
    
    int main(int argc, char const *argv[])
    {
        logic_struct.act_exe();         //运行void Act_Fun(void)
        printf("status study!
    ");
        return 0;
    }
    

    状态机学习

    #include <stdio.h>
    
    typedef void (*pActionFun)(void);
    
    typedef enum{
        event_1=1,
        event_2,
        event_3,
        event_4,
        event_5,
    }TriggerEvent;
    
    typedef enum{
        status_1=1,
        status_2,
        status_3,
        status_4,
        status_5,
    }Status;
    
    typedef struct status
    {
        Status          cur_status;     //当前状态
        TriggerEvent    trigger_event;  //触发事件
        Status          next_status;    //触发之后进入下一个状态
        pActionFun      act_exe;        //触发之后执行的函数
    }LogicStruct;
    
    typedef struct
    {
        Status        status;
        int           status_num;
        LogicStruct*  logic_content;
    }StatusMachine;
    
    
    
    void Act_Fun132(void)
    {
        printf("Act_Fun 132 ! 
    ");
    }
    void Act_Fun142(void)
    {
        printf("Act_Fun 142 ! 
    ");
    }
    void Act_Fun213(void)
    {
        printf("Act_Fun 213 ! 
    ");
    }
    void Act_Fun242(void)
    {
        printf("Act_Fun 242 ! 
    ");
    }
    void Act_Fun321(void)
    {
        printf("Act_Fun 321 ! 
    ");
    }
    void Act_Fun332(void)
    {
        printf("Act_Fun 332 ! 
    ");
    }
    void Act_Fun353(void)
    {
        printf("Act_Fun 353 ! 
    ");
    }
    
    
    void RunSM(StatusMachine* xSM ,TriggerEvent TrigEveID)
    {
        for (int i = 0; i < xSM->status_num; i++)
        {
            if((xSM->logic_content[i].cur_status == xSM->status) && (xSM->logic_content[i].trigger_event == TrigEveID))
            {
                xSM->status = xSM->logic_content[i].next_status;
                xSM->logic_content[i].act_exe();     //运行void Act_Fun(void)
                break;
            }
        }
    }
    
    
    LogicStruct logic_Array[] = {
        {status_1,event_3,status_2,Act_Fun132},//初始化为状态1,当事件3来临时,切换至状态2,运行函数Act_Fun132
        {status_1,event_4,status_2,Act_Fun142},//当状态为状态1,当事件4来临时,切换至状态2,运行函数Act_Fun142
        {status_2,event_1,status_3,Act_Fun213},//当状态为状态2,当事件1来临时,切换至状态3,运行函数Act_Fun213
        {status_2,event_4,status_2,Act_Fun242},//当状态为状态2,当事件4来临时,切换至状态2,运行函数Act_Fun242
        {status_3,event_2,status_1,Act_Fun321},//当状态为状态3,当事件2来临时,切换至状态1,运行函数Act_Fun321
        {status_3,event_3,status_2,Act_Fun332},//当状态为状态3,当事件3来临时,切换至状态2,运行函数Act_Fun332
        {status_3,event_5,status_3,Act_Fun353},//当状态为状态3,当事件5来临时,切换至状态3,运行函数Act_Fun353
    };
    
    StatusMachine gSM = {status_1,7,logic_Array};
    
    int main(int argc, char const *argv[])
    {
    
        StatusMachine*  pSM = NULL;
    
        pSM = &gSM;
    
        TriggerEvent TrigEve[15] = {
            event_1,event_2,event_3,event_4,event_5,
            event_1,event_2,event_3,event_4,event_5,
            event_1,event_2,event_3,event_4,event_5
        };
    
        for (int j = 0; j < 15; j++)
        {
            RunSM(pSM ,TrigEve[j]);
        }
    
        printf("status study!
    ");
        return 0;
    }
    
  • 相关阅读:
    SDN大作业
    第06组 Beta版本演示
    SqlServer 将多行字段合并成单行
    C# MD5加密字符串
    Request.IsAjaxRequest()总是返回false
    Mybatis 语句包含单引号的写法
    idea每次启动maven项目都貌似读不到配置
    idea下springboot项目配置文件application.properties不生效的问题
    Ubuntu 设置时区
    SpringBoot 使用MyBatis
  • 原文地址:https://www.cnblogs.com/hhsxy/p/14018353.html
Copyright © 2011-2022 走看看