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;
    }
    
  • 相关阅读:
    openAI的仿真环境Gym Retro的Python API接口(续1)—— 游戏过程记录及回放
    openAI的仿真环境Gym Retro的Python API接口
    如何使用Python环境下的2D经典游戏仿真器(openai推出的)retro库运行游戏"刺猬索尼克" (SonicTheHedgehog-Genesis)
    运行openai的gym代码报错提示import pyglet,安装后依然报错:ImportError: sys.meta_path is None, Python is likely shutting down
    “阿里事件”的结束真的是结束吗
    BMS(电池管理系统)第二课——一文说清各大IC厂商模拟前端(AFE)优缺点
    BMS(电池管理系统)第一课——BMS系统框架简介什么是BMS?
    Linux内核调试技术——kprobe使用与实现
    Qt事件:changeEvent(改变事件)
    ImGui-imgui实例解析之ShowDemoWindowWidgets-Basic
  • 原文地址:https://www.cnblogs.com/hhsxy/p/14018353.html
Copyright © 2011-2022 走看看