精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

函數指針方法實現簡單狀態機(附代碼)

開發 后端
之前寫過一篇狀態機的實用文章,很多朋友說有幾個地方有點難度不易理解,今天給大家換種簡單寫法,使用函數指針的方法實現狀態機。

之前寫過一篇狀態機的實用文章,很多朋友說有幾個地方有點難度不易理解,今天給大家換種簡單寫法,使用函數指針的方法實現狀態機。

狀態機簡介

有限狀態機FSM是有限個狀態及在這些狀態之間的轉移和動作等行為的數學模型,是一種邏輯單元內部的高效編程方法,可以根據不同狀態或者消息類型進行相應的處理邏輯,使得程序邏輯清晰易懂。

函數指針實現FSM

使用函數指針實現FSM可以分為3個步驟

  1. 建立相應的狀態表和動作查詢表
  2. 根據狀態表、事件、動作表定位相應的動作處理函數
  3. 執行完成后再進行狀態的切換

代碼實現步驟

1.定義狀態數據的枚舉類型 

  1. typedef enum { 
  2.   state_1=1, 
  3.   state_2, 
  4.   state_3, 
  5.   state_4 
  6. }State; 

2.定義事件的枚舉類型 

  1. typedef enum{ 
  2.   event_1=1, 
  3.   event_2, 
  4.   event_3, 
  5.   event_4, 
  6.   event_5 
  7. }EventID; 

3.定義狀態表的數據類型 

  1. typedef struct 
  2.     int event;   //事件 
  3.     int CurState;  //當前狀態 
  4.     void (*eventActFun)();  //函數指針 
  5.     int NextState;  //下一個狀態 
  6. }StateTable; 

4.定義處理函數及建立狀態表 

  1. void f121() 
  2.     printf("this is f121\n"); 
  3. void f221() 
  4.     printf("this is f221\n"); 
  5. void f321() 
  6.     printf("this is f321\n"); 
  7.  
  8. void f122() 
  9.     printf("this is f122\n"); 
  10.  
  11. StateTable fTable[] = 
  12.     //{到來的事件,當前的狀態,將要要執行的函數,下一個狀態} 
  13.     { event_1,  state_1,    f121,  event_2 }, 
  14.     { event_2,  state_2,    f221,  event_3 }, 
  15.     { event_3,  state_3,    f321,  event_4 }, 
  16.     { event_4,  state_4,    f122,  event_1 }, 
  17.     //add your code here 
  18. }; 

5.狀態機類型,及狀態機接口函數

  1. /*狀態機類型*/ 
  2. typedef struct { 
  3.     int curState;//當前狀態 
  4.     StateTable * stateTable;//狀態表 
  5.     int size;//表的項數 
  6. }fsmType; 
  7.  
  8. /*狀態機注冊,給它一個狀態表*/ 
  9. void fsmRegist(fsmType* pFsm, StateTable* pTable) 
  10.     pFsm->stateTable = pTable; 
  11.  
  12. /*狀態遷移*/ 
  13. void fsmStateTransfer(fsmType* pFsm, int state) 
  14.     pFsm->curState = state; 
  15.  
  16. /*事件處理*/ 
  17. void fsmEventHandle(fsmType* pFsm, int event) 
  18.     StateTable* pActTable = pFsm->stateTable; 
  19.     void (*eventActFun)() = NULL;  //函數指針初始化為空 
  20.     int NextState; 
  21.     int CurState = pFsm->curState; 
  22.     int maxNum = pFsm->size
  23.     int flag = 0; //標識是否滿足條件 
  24.  
  25.     /*獲取當前動作函數*/ 
  26.     for (int i = 0; i<maxNum; i++) 
  27.     { 
  28.         //當且僅當當前狀態下來個指定的事件,我才執行它 
  29.         if (event == pActTable[i].event && CurState == pActTable[i].CurState) 
  30.         { 
  31.             flag = 1; 
  32.             eventActFun = pActTable[i].eventActFun; 
  33.             NextState = pActTable[i].NextState; 
  34.             break; 
  35.         } 
  36.     } 
  37.  
  38.  
  39.     if (flag) //如果滿足條件了 
  40.     { 
  41.         /*動作執行*/ 
  42.         if (eventActFun) 
  43.         { 
  44.             eventActFun(); 
  45.         } 
  46.  
  47.         //跳轉到下一個狀態 
  48.         fsmStateTransfer(pFsm, NextState); 
  49.     } 
  50.     else 
  51.     { 
  52.         printf("there is no match\n"); 
  53.     } 

 

附代碼

代碼直接復制過去就行啦,本想打包的,太麻煩了。

測試程序

  1. //編譯器:http://www.dooccn.com/cpp/ 
  2. //來源:技術讓夢想更偉大 
  3. //作者:李肖遙 
  4. #include <stdio.h> 
  5.  
  6. typedef enum { 
  7.   state_1=1, 
  8.   state_2, 
  9.   state_3, 
  10.   state_4 
  11. }State; 
  12.  
  13. typedef enum{ 
  14.   event_1=1, 
  15.   event_2, 
  16.   event_3, 
  17.   event_4, 
  18.   event_5 
  19. }EventID; 
  20.  
  21. typedef struct { 
  22.     int event;   //事件 
  23.     int CurState;  //當前狀態 
  24.     void (*eventActFun)();  //函數指針 
  25.     int NextState;  //下一個狀態 
  26. }StateTable; 
  27.  
  28. void f121() 
  29.     printf("this is f121\n"); 
  30. void f221() 
  31.     printf("this is f221\n"); 
  32. void f321() 
  33.     printf("this is f321\n"); 
  34.  
  35. void f122() 
  36.     printf("this is f122\n"); 
  37.  
  38. StateTable fTable[] = 
  39.     //{到來的事件,當前的狀態,將要要執行的函數,下一個狀態} 
  40.     { event_1,  state_1,    f121,  event_2 }, 
  41.     { event_2,  state_2,    f221,  event_3 }, 
  42.     { event_3,  state_3,    f321,  event_4 }, 
  43.     { event_4,  state_4,    f122,  event_1 }, 
  44.     //add your code here 
  45. }; 
  46.  
  47. /*狀態機類型*/ 
  48. typedef struct { 
  49.     int curState;//當前狀態 
  50.     StateTable * stateTable;//狀態表 
  51.     int size;//表的項數 
  52. }fsmType; 
  53.  
  54. /*狀態機注冊,給它一個狀態表*/ 
  55. void fsmRegist(fsmType* pFsm, StateTable* pTable) 
  56.     pFsm->stateTable = pTable; 
  57.  
  58. /*狀態遷移*/ 
  59. void fsmStateTransfer(fsmType* pFsm, int state) 
  60.     pFsm->curState = state; 
  61.  
  62. /*事件處理*/ 
  63. void fsmEventHandle(fsmType* pFsm, int event) 
  64.     StateTable* pActTable = pFsm->stateTable; 
  65.     void (*eventActFun)() = NULL;  //函數指針初始化為空 
  66.     int NextState; 
  67.     int CurState = pFsm->curState; 
  68.     int maxNum = pFsm->size
  69.     int flag = 0; //標識是否滿足條件 
  70.  
  71.     /*獲取當前動作函數*/ 
  72.     for (int i = 0; i<maxNum; i++) 
  73.     { 
  74.         //當且僅當當前狀態下來個指定的事件,我才執行它 
  75.         if (event == pActTable[i].event && CurState == pActTable[i].CurState) 
  76.         { 
  77.             flag = 1; 
  78.             eventActFun = pActTable[i].eventActFun; 
  79.             NextState = pActTable[i].NextState; 
  80.             break; 
  81.         } 
  82.     } 
  83.  
  84.  
  85.     if (flag) //如果滿足條件了 
  86.     { 
  87.         /*動作執行*/ 
  88.         if (eventActFun) 
  89.         { 
  90.             eventActFun(); 
  91.         } 
  92.  
  93.         //跳轉到下一個狀態 
  94.         fsmStateTransfer(pFsm, NextState); 
  95.     } 
  96.     else 
  97.     { 
  98.         printf("there is no match\n"); 
  99.     } 
  100.  
  101. int main() 
  102.     fsmType pType; 
  103.     fsmRegist(&pType,fTable); 
  104.     pType.curState = state_1; 
  105.     pType.size = sizeof(fTable)/sizeof(StateTable); 
  106.  
  107.  
  108.     printf("init state:%d\n\n",pType.curState); 
  109.  
  110.     fsmEventHandle(&pType,event_1); 
  111.     printf("state:%d\n\n",pType.curState); 
  112.  
  113.     fsmEventHandle(&pType,event_2); 
  114.     printf("state:%d\n\n",pType.curState); 
  115.  
  116.     fsmEventHandle(&pType,event_3); 
  117.     printf("state:%d\n\n",pType.curState); 
  118.  
  119.     fsmEventHandle(&pType,event_4); 
  120.     printf("state:%d\n\n",pType.curState); 
  121.  
  122.     fsmEventHandle(&pType,event_2); 
  123.     printf("state:%d\n\n",pType.curState); 
  124.  
  125.     return 0; 

編譯結果 

 

 

 

總結

使用函數指針實現的FSM的過程還是比較費時費力的,但是這一切相對一大堆的if/else、switch/case來說都是值得的,當你的程序規模變得越來越大的時候,基于這種表結構的狀態機,維護程序起來會清晰很多。 

責任編輯:龐桂玉 來源: C語言與C++編程
相關推薦

2021-12-28 08:24:18

函數指針有限狀態機編程

2024-10-10 17:46:06

2011-06-24 16:09:24

Qt 動畫 狀態機

2023-03-06 07:35:30

狀態機工具訂單狀態

2025-10-29 07:38:45

2010-06-18 13:15:07

UML狀態機圖

2010-06-18 12:38:38

UML狀態機視圖

2021-07-08 09:15:20

單片機編程狀態機編程語言

2010-06-18 13:25:44

UML狀態機視圖

2013-09-03 09:57:43

JavaScript有限狀態機

2024-01-08 09:46:47

2011-06-29 18:36:59

Qt 動畫 狀態機

2020-10-15 10:38:35

C語言狀態模型

2021-06-05 05:11:52

代碼狀態機邏輯

2010-07-08 13:03:31

UML狀態機圖

2020-03-27 10:50:29

DSL 狀態機工具

2010-07-12 15:00:56

UML狀態機視圖

2022-03-06 19:57:50

狀態機easyfsm項目

2021-08-19 09:00:00

微服務開發架構

2021-04-29 09:31:05

前端開發技術
點贊
收藏

51CTO技術棧公眾號

日韩一区二区三区xxxx| 亚洲成av人综合在线观看| 国产精品美女视频网站| 任我爽在线视频| 国产精品xxxav免费视频| 色婷婷综合久久| 国产精品啪啪啪视频| 四虎影视2018在线播放alocalhost| 日韩黄色片在线观看| 久久99亚洲精品| 微拍福利一区二区| 成人偷拍自拍| 欧美老年两性高潮| www.99热这里只有精品| 色的视频在线免费看| 99热99精品| 亚洲曰本av电影| 久久精品国产亚洲av麻豆蜜芽| 欧美视频成人| 日韩亚洲第一页| 蜜桃传媒一区二区亚洲av| 欧美久久一区二区三区| 欧美亚洲丝袜传媒另类| 久久精品国产sm调教网站演员| 91大神xh98hx在线播放| 99精品国产热久久91蜜凸| 亚洲一区二区中文| 亚洲精品一区二区二区| 日韩视频免费| 欧美日韩成人在线观看| 婷婷社区五月天| 国产精品一在线观看| 欧美mv日韩mv| 佐山爱在线视频| 日日夜夜精品| 欧洲视频一区二区| 国产又大又硬又粗| 国产精品论坛| 亚洲一区二区三区视频在线| 国产av第一区| 国产视频中文字幕在线观看| 欧美国产激情二区三区| 久久视频在线观看中文字幕| 黄色片一区二区三区| 国产一区在线观看视频| 国产日韩欧美在线看| 无码人妻精品一区二| 国产毛片久久| 欧美最猛性xxxx| 精品国产一区二区三区四| 日韩天堂av| 91精品国产91久久久久久| 国产一级特黄aaa大片| 欧美日韩久久| 欧美激情第三页| 国产在线一二区| 国内在线观看一区二区三区| 欧美激情视频在线观看| 久草网站在线观看| 欧美精品aa| 久久久噜噜噜久久| 国产无套内射又大又猛又粗又爽 | 老司机免费视频久久| 欧美在线视频一二三| 国产精品100| 日本va欧美va瓶| 国产日韩欧美夫妻视频在线观看| 国产免费黄色大片| 国产精品小仙女| 国产九色91| 视频一区二区在线播放| 国产亚洲欧美激情| 伊人久久大香线蕉综合75| 哥也色在线视频| 亚洲影院免费观看| 日本不卡在线观看视频| yy6080久久伦理一区二区| 欧美精三区欧美精三区| 亚洲av综合色区无码另类小说| baoyu135国产精品免费| 亚洲欧美福利视频| 久久精品国产亚洲AV成人婷婷| 伊人久久大香线蕉综合四虎小说 | 国产成人在线观看免费网站| 99re在线国产| 欧美高清电影在线| 中文字幕一区在线| 日韩精品一区在线视频| 欧美一区 二区 三区| 欧美精品乱码久久久久久| 国产亚洲精品成人a| 一道本一区二区三区| 日韩在线视频国产| 日韩黄色精品视频| 麻豆精品一二三| 国产精品国产精品| www.中文字幕久久久| 一片黄亚洲嫩模| 日本xxxxxxx免费视频| av日韩在线免费观看| 日韩av在线直播| 永久av免费网站| 国产精品日韩| 亚洲一区二区三区sesese| 全色精品综合影院| 一区二区三区不卡在线观看| 久久久精品麻豆| 红杏aⅴ成人免费视频| 中文字幕亚洲自拍| 六月丁香婷婷综合| 国产乱码精品一区二区三| 欧美日韩国产一二| 国精产品一区一区三区mba下载| 91成人免费电影| 久久性爱视频网站| 亚洲精品va| 国产精品久久久久久久7电影| 黄色小视频免费观看| 亚洲视频在线一区二区| 男女无套免费视频网站动漫| 久久久久久毛片免费看| 欧美成人精品一区| 在线亚洲欧美日韩| 久久久av毛片精品| av免费观看网| 99久久香蕉| 美乳少妇欧美精品| 97精品久久人人爽人人爽| 26uuu久久天堂性欧美| 国内少妇毛片视频| 99er精品视频| yellow中文字幕久久| 超碰在线免费97| 久久麻豆一区二区| 国产资源在线视频| 国产精品极品在线观看| 久久国产精品久久精品| 一级片在线免费观看视频| 国产日韩成人精品| 北条麻妃在线一区| 欧美热在线视频精品999| 8050国产精品久久久久久| 国产强被迫伦姧在线观看无码| 国产精品色在线| 日本xxxx黄色| 日韩黄色大片| 国产区精品在线观看| av在线播放av| 欧美日韩国产一级片| 在线观看免费黄色网址| 美女脱光内衣内裤视频久久影院| 水蜜桃亚洲精品| 男女啪啪999亚洲精品| 色一情一乱一区二区| 中文字幕乱码人妻二区三区| 国产精品久久久久久久久久免费看| 天堂网在线免费观看| 99视频精品全部免费在线视频| 成人欧美一区二区三区在线湿哒哒| 黄页视频在线播放| 日韩免费看网站| 国产精品成人免费一区二区视频| 成人高清免费观看| 人妻熟女一二三区夜夜爱| 久久av影视| 成人激情视频在线| 欧美xxxx视频| 亚洲精品一区在线观看香蕉| 最新中文字幕在线观看视频| 一区精品在线播放| 欧美午夜精品一区二区| 国产精品人人爽人人做我的可爱 | 国产精品97| 亚洲自拍小视频免费观看| av资源网在线播放| 亚洲天堂网站在线观看视频| 一本色道久久综合亚洲| 亚洲综合偷拍欧美一区色| 精品夜夜澡人妻无码av| 蜜臀av性久久久久蜜臀aⅴ| 日本老太婆做爰视频| 美女午夜精品| 国产精品视频一| 黄色成人在线网| 亚洲人成在线观| 99久久亚洲精品日本无码| 午夜久久久久久久久| 国产综合精品久久久久成人av| 国产又黄又大久久| 女人和拘做爰正片视频| 国产精品久久久久无码av| 国产免费一区二区| 国产精品一区二区免费福利视频| 欧美大片在线免费观看| 国产女主播在线直播| 日韩一区二区免费高清| 久久久久99精品成人片我成大片| 日韩理论片中文av| 91视频啊啊啊| 国产一区二区精品在线观看| 丰满少妇被猛烈进入高清播放| 亚洲xxx拳头交| 欧美人与性禽动交精品| 久久精品九色| 国产精品美乳一区二区免费| segui88久久综合9999| 精品国产一区二区三区四区在线观看 | 欧美自拍资源在线| 免费看日产一区二区三区| 国产91色在线|免| 国产丝袜视频在线播放| xvideos亚洲| 国产视频第一页在线观看| 精品美女在线播放| 一二区在线观看| 色综合中文综合网| 日本熟妇毛耸耸xxxxxx| 亚洲免费视频中文字幕| 色屁屁草草影院ccyy.com| 91婷婷韩国欧美一区二区| 中文字幕久久久久久久| 久久国产综合精品| 色诱视频在线观看| av不卡在线看| 亚洲精品久久久久久久蜜桃臀| 国产精品国内免费一区二区三区| 欧美日韩中文国产一区发布| 粉嫩精品导航导航| 成人91免费视频| 国产精品日韩精品在线播放| 国产精品日韩久久久久| 国产v综合v| 国产精品www色诱视频| 国产理论在线| 午夜精品理论片| 成人影音在线| 97视频在线观看免费高清完整版在线观看 | 亚洲精品一区二区三区在线| 国产一区二区视频在线观看| 天然素人一区二区视频| 国产精品777| 成人软件在线观看| 国产精品99导航| 欧美极品影院| 国产精品九九久久久久久久| 性欧美超级视频| 国产精品成人免费电影| 91精品韩国| 国产美女被下药99| 91精品网站在线观看| 96pao国产成视频永久免费| 国模大尺度视频一区二区| 成人乱人伦精品视频在线观看| 日韩一级特黄| 91在线免费看片| 国产精品极品在线观看| 久久99精品国产99久久| 亚洲肉体裸体xxxx137| 欧美日韩一区在线观看视频| 国内精品久久久久久99蜜桃| 色中色综合成人| 五月开心六月丁香综合色啪| 日韩一级特黄毛片| 国产欧美在线| 午夜免费高清视频| 激情欧美日韩一区二区| www日本在线观看| 91在线观看污| 亚洲一区二区三区日韩 | 欧美极品aaaaabbbbb| 亚洲成av人片| 天天射天天干天天| 欧美日本视频在线| 亚洲av综合色区无码一区爱av| 亚洲国产成人av在线| 久草在线免费福利资源| 久久国产一区二区三区| 欧美性猛片xxxxx免费中国| 97国产成人精品视频| 91精品影视| 亚洲一区二区三区香蕉| 亚洲第一二三区| 中文视频一区视频二区视频三区| 欧美日韩亚洲一区在线观看| 男人天堂1024| 国内精品国产成人| 自拍视频一区二区| 国产精品欧美精品| 国产一级免费观看| 欧美视频一二三区| 亚洲乱码国产乱码精品精软件| 亚洲人成网站999久久久综合| 手机av免费在线| 国产成人在线一区二区| 亚洲成人五区| 日韩av图片| 伊人久久亚洲影院| 波多野结衣xxxx| 97超碰欧美中文字幕| 亚洲人与黑人屁股眼交| 黑人精品xxx一区一二区| 国产剧情久久久| 亚洲欧洲日产国码av系列天堂| 怡红院av在线| 国产日韩在线免费| 久久97视频| ww国产内射精品后入国产| 国产一区二区调教| 韩国三级hd中文字幕| 欧美日韩国产激情| 国产探花精品一区二区| 一道本无吗dⅴd在线播放一区| cao在线视频| 91手机在线视频| 久久精品高清| 国产精品乱码久久久久| 99精品欧美一区二区三区小说| 九九九在线视频| 欧美精品成人一区二区三区四区| 韩国三级在线观看久| 77777亚洲午夜久久多人| 视频在线观看免费影院欧美meiju| 一个色的综合| 日韩av在线播放中文字幕| 免费的av网站| 亚洲成a人v欧美综合天堂| xxxwww在线观看| 欧美精品一区三区| 99精品视频在线免费播放| 日韩欧美在线电影| 日韩综合在线视频| 亚洲成人网在线播放| 精品人伦一区二区三区蜜桃免费| 欧美视频一二区| 久久久久久69| 国产精品xxx在线观看| av网站手机在线观看| 福利视频网站一区二区三区| 欧美日韩亚洲国产另类| 日韩亚洲欧美中文三级| 成人免费看片| 96国产粉嫩美女| 狠狠综合久久av一区二区老牛| 精品国产午夜福利在线观看| 亚洲人成7777| 国产黄色av网站| 色中色综合影院手机版在线观看| 秋霞一区二区| 青草网在线观看| 99精品久久只有精品| 99久久精品国产亚洲| 亚洲网站视频福利| 亚洲天堂1区| 一区国产精品| 国产一区二区调教| 国产精彩视频在线| 日韩电影中文字幕一区| av电影一区| 亚洲欧美日韩综合一区| 国产一区二区三区免费看| 久草国产在线观看| 精品乱码亚洲一区二区不卡| 黄色软件视频在线观看| 欧美日韩精品久久| 久久国产精品99精品国产| 波多野结衣爱爱视频| 日韩精品在线网站| 涩涩视频在线播放| 亚洲7777| 国产精品综合久久| 伊人久久综合视频| 中文欧美在线视频| 视频欧美一区| 日韩毛片在线免费看| ...xxx性欧美| 熟妇人妻一区二区三区四区| 国产精品av在线播放| 午夜激情久久| 欲求不满的岳中文字幕| 在线观看视频欧美| av香蕉成人| 欧美不卡在线一区二区三区| 另类小说一区二区三区| 黄色小视频在线免费看| 国产亚洲在线播放| 玖玖玖电影综合影院| 日本精品一区二区三区四区| 亚洲男人电影天堂| 青青青草原在线| 亚洲aaa激情| 性色一区二区| 小向美奈子av| 亚洲九九九在线观看| 国产精品99久久免费| 男人日女人bb视频| 亚洲免费资源在线播放| 蜜桃视频在线入口www| 91久久国产综合久久91精品网站 | 91成人免费观看网站| 久久中文字幕av|