<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ```c++ #include <stdio.h> #include <unistd.h> enum { GET_UP = 0, GO_TO_SCHOOL, HAVE_LUNCH, GO_HOME, DO_HOMEWORK, SLEEP, }; enum { EVENT1 = 1, EVENT2, EVENT3, }; typedef struct FsmTable_s { int event; //事件 int CurState; //當前狀態 void (*eventActFun) (); //函數指針 int NextState; //下一個狀態 }FsmTable_t; void GetUp() { // do something printf("xiao ming gets up!\n"); } void Go2School() { // do something printf("xiao ming goes to school!\n"); } void HaveLunch() { // do something printf("xiao ming has lunch!\n"); } void DoHomework() { // do something printf("xiao ming does homework!\n"); } void Go2Bed() { // do something printf("xiao ming goes to bed!\n"); } FsmTable_t XiaoMingTable[] = { //{到來的事件,當前的狀態,將要要執行的函數,下一個狀態} { EVENT1, SLEEP, GetUp, GET_UP }, { EVENT2, GET_UP, Go2School, GO_TO_SCHOOL }, { EVENT3, GO_TO_SCHOOL, HaveLunch, HAVE_LUNCH }, { EVENT1, HAVE_LUNCH, DoHomework, DO_HOMEWORK }, { EVENT2, DO_HOMEWORK, Go2Bed, SLEEP }, //add your codes here }; typedef struct FSM_s { FsmTable_t* FsmTable; //指向的狀態表 int curState; //FSM當前所處的狀態 }FSM_t; int g_max_num; //狀態表里含有的狀態個數 //狀態機注冊 void FSM_Regist(FSM_t* pFsm, FsmTable_t* pTable) { pFsm->FsmTable = pTable; } void FSM_StateTransfer(FSM_t* pFsm, int state) { pFsm->curState= state; } //事件處理 void FSM_EventHandle(FSM_t* pFsm, int event) { FsmTable_t* pActTable = pFsm->FsmTable; void (*eventActFun)() = NULL; int NextState; int CurState = pFsm->curState; int flag = 0; int i; for (int i = 0; i < g_max_num; i++) { //當且僅當當前狀態下來個指定的事件,我才執行它 if (event == pActTable[i].event && CurState == pActTable[i].CurState) { flag = 1; eventActFun = pActTable[i].eventActFun; NextState = pActTable[i].NextState; break; } } if (flag) { if (eventActFun) { eventActFun(); } FSM_StateTransfer(pFsm, NextState); } else { //do nothing } } //初始化FSM void InitFsm(FSM_t* pFsm) { g_max_num = sizeof(XiaoMingTable) / sizeof(FsmTable_t); pFsm->curState = SLEEP; FSM_Regist(pFsm, XiaoMingTable); } //測試用的 void test(int *event) { if (*event == 3) { *event = 1; } else { (*event)++; } } int main() { FSM_t fsm; InitFsm(&fsm); int event = EVENT1; //小明的一天,周而復始的一天又一天,進行著相同的活動 while (1) { printf("event %d is coming...\n", event); FSM_EventHandle(&fsm, event); printf("fsm current state %d\n", fsm.curState); test(&event); sleep(1); //休眠1秒,方便觀察 } return 0; } ``` :https://www.cnblogs.com/skyfsm/p/7071386.html
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看