精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲国产精品一区制服丝袜| www.久久热| 日本一区二区三区在线观看| 91视频国产精品| 免费无码毛片一区二区app| 久久电影在线| 欧美在线小视频| 黄黄视频在线观看| 国模精品一区二区| 国产麻豆9l精品三级站| 欧美最顶级丰满的aⅴ艳星| 青青青视频在线播放| aiai久久| 欧美日韩国产中文| 欧美日韩在线中文| 污污的网站在线免费观看| 久久夜色精品国产噜噜av| 51国偷自产一区二区三区的来源| 亚洲第一在线播放| 欧美色图麻豆| 久久精品男人天堂| 欧美老熟妇乱大交xxxxx| 精品中文在线| 欧美日韩一区视频| 免费日韩视频在线观看| 日韩欧美一起| 国产精品福利影院| 免费不卡亚洲欧美| 国产女主播在线播放| 特级西西人体wwwww| 日韩一区二区三区免费视频| 亚洲成在人线免费| 蜜桃视频成人在线观看| av福利在线播放| 久久在线观看免费| 激情伦成人综合小说| 性欧美一区二区三区| 久久99久久久久久久久久久| 国产成人啪精品视频免费网| 国产成人精品a视频一区| 欧美99久久| 久久不射电影网| av资源在线免费观看| 神马久久一区二区三区| 亚洲男人第一网站| 中文在线永久免费观看| 草草视频在线一区二区| 日韩欧美高清一区| 26uuu国产| 亚洲大奶少妇| 欧美mv日韩mv亚洲| 国产乱淫av麻豆国产免费| 精品国产亚洲日本| 欧美一区二区在线不卡| 992kp免费看片| а天堂中文最新一区二区三区| 欧美在线观看一二区| 四虎永久在线精品无码视频| 在线观看v片| 懂色av影视一区二区三区| 国产午夜大地久久| 午夜欧美激情| 色综合久久天天| 美女喷白浆视频| 成人日韩av| 欧美高清视频不卡网| 天堂在线一区二区三区| 欧美高清hd| 精品国一区二区三区| 中国一级特黄录像播放| 网友自拍一区| 一区二区三区亚洲| 久艹在线观看视频| 国内自拍一区| 欧美一级片免费在线| 日本免费精品视频| 日韩国产高清影视| 亚洲一区二区在线| 无码国产精品一区二区免费16| 久久婷婷久久一区二区三区| 色综合电影网| 在线中文字幕电影| 精品免费在线视频| 搡女人真爽免费午夜网站| 亚洲最大的免费视频网站| 日韩一区二区在线播放| 91精品啪在线观看国产| 久操成人av| 精品国产视频在线| 日本少妇裸体做爰| 日韩激情中文字幕| 91日韩久久| 日韩av成人| 亚洲欧美电影院| 日韩小视频在线播放| 欧美三区四区| 日韩欧美区一区二| 国产美女免费无遮挡| 亚洲精品97| 欧洲成人性视频| 国产麻豆精品一区| 91色.com| mm131午夜| 婷婷综合六月| 精品国产免费一区二区三区香蕉 | 天天干天天操天天拍| 欧美激情视频一区二区三区在线播放 | 91福利在线免费观看| 污污网站免费看| gogo人体一区| 中国china体内裑精亚洲片| 久久免费黄色网址| 另类的小说在线视频另类成人小视频在线 | 成人交换视频| 亚洲精品久久久久久久久久久久| 久久久久麻豆v国产| 国产日韩专区| 99国产高清| 日本中文字幕在线视频| 精品免费在线视频| 亚洲av熟女高潮一区二区| 91精品国产91久久久久久密臀| 91国产中文字幕| 精品人妻伦一区二区三区久久| 国产亚洲一区二区在线观看| 欧美精品卡一卡二| 国产乱码精品一区二区三区亚洲人| 国产精品国精产品一二| 亚洲美女啪啪| 91久久久久久久一区二区| 你懂得在线网址| 一区二区高清在线| 一起操在线视频| 国产精品一区二区av交换| 欧美大片免费观看| 国产巨乳在线观看| 中文字幕一区免费在线观看| 国产主播在线看| 国产精品极品在线观看| 美女黄色丝袜一区| 在线观看日批视频| 国产欧美在线观看一区| 欧美牲交a欧美牲交aⅴ免费下载| 国产精品极品在线观看| 久久久久久国产三级电影| www.av导航| 一区二区三区四区在线免费观看| 人妻换人妻仑乱| 欧美在线黄色| 91成人免费看| 色帝国亚洲欧美在线| 欧美一级片免费看| 国产精品白嫩白嫩大学美女| 加勒比av一区二区| 亚洲国产欧美一区| 久久综合入口| 高清在线视频不卡| 亚洲激情视频网站| 国产精品久久久久久99| 91影院在线观看| 欧美日韩在线中文| 欧美系列电影免费观看| 国产这里只有精品| h片在线播放| 欧美刺激脚交jootjob| 国产奶水涨喷在线播放| 91社区在线播放| 少妇性l交大片| 欧美1级片网站| 91观看网站| 丁香高清在线观看完整电影视频| 亚洲精品国产拍免费91在线| 色一情一乱一伦| 国产精品免费人成网站| 久久6免费视频| 狠狠入ady亚洲精品| 久久久久久九九九九| 桃子视频成人app| www.日韩av.com| 蜜桃视频久久一区免费观看入口| 亚洲444eee在线观看| 永久免费看mv网站入口78| 秋霞国产午夜精品免费视频| 欧美性受xxxx黑人猛交88| 国产精品毛片久久久| 国产精品99久久久久久白浆小说| 免费黄色网址在线观看| 精品国内片67194| 成人性生交视频免费观看| 亚洲色图 校园春色| 亚洲成人一区二区在线观看| 色婷婷av777| 国产在线不卡一区| 男人操女人免费软件| 亚洲第一偷拍| 欧美欧美一区二区| 久久精品免视看国产成人| 91精品国产91久久久| 日韩免费网站| 日韩av在线免费播放| 国产精品久久久久久免费播放| 亚洲午夜日本在线观看| 欧美黄色一级生活片| 国产精品1区2区3区| 欧美成人免费高清视频| 综合视频在线| 日本一区免费在线观看| 中文字幕一区二区三区四区久久| 日韩av日韩在线观看| 亚洲www色| 在线播放国产精品| 日本美女一级片| 欧美日韩高清不卡| 亚洲综合图片网| 亚洲国产成人91porn| 少妇视频一区二区| 91在线小视频| 亚洲少妇一区二区| 久久精品久久久精品美女| 女人和拘做爰正片视频| 国产精品theporn| 伊人情人网综合| 欧美精品色图| 裸模一区二区三区免费| 999久久久精品一区二区| 成人网中文字幕| 国产成人精选| 日本欧美在线视频| 麻豆网站免费在线观看| 欧美激情一区二区三区久久久 | 精品视频中文字幕| 丰满肥臀噗嗤啊x99av| 91麻豆精品国产91久久久久久| 人妻中文字幕一区二区三区| 日韩欧美国产免费播放| 日韩伦理在线视频| 亚洲国产成人av好男人在线观看| 欧美激情国产精品免费| 亚洲伦在线观看| 69av视频在线| 艳妇臀荡乳欲伦亚洲一区| 精品自拍偷拍视频| 亚洲欧美另类小说| 大地资源高清在线视频观看| 中文字幕电影一区| 农村老熟妇乱子伦视频| 国产精品免费av| jizzjizz日本少妇| 国产精品国产精品国产专区不蜜| 免费看一级黄色| 中文字幕在线不卡| 日韩三级在线观看视频| 亚洲欧美另类小说视频| 欧美日韩激情在线观看| 一区二区三区丝袜| 精品视频久久久久| 午夜欧美2019年伦理| 国产一区二区99| 色综合天天性综合| 中文字幕乱伦视频| 欧美精品久久一区| 99视频在线观看免费| 精品国精品国产| 天天干天天草天天射| 亚洲剧情一区二区| av在线日韩国产精品| 久热爱精品视频线路一| 国产嫩草在线视频| 国产91|九色| 欧美日韩国产网站| 91久久久久久久久久久| 高潮按摩久久久久久av免费| 国产精品香蕉视屏| 亚洲精品中文字幕99999| 日本一区二区三不卡| 99久久夜色精品国产亚洲狼| 影音先锋成人资源网站| 在线欧美日韩| 福利在线一区二区三区| 国产伦理精品不卡| 中文字幕av网址| 亚洲欧美在线视频| 日韩在线观看第一页| 欧美午夜精品一区| 国产福利资源在线| 亚洲免费伊人电影在线观看av| √天堂资源地址在线官网| 欧美激情精品久久久久久蜜臀| 亚洲电影观看| 成人一区二区电影| 先锋影音国产精品| 黄色a级在线观看| 亚洲免费中文| 91插插插影院| 久久综合一区二区| 国产精品嫩草影院俄罗斯| 精品久久久久久电影| 91禁在线观看| 日韩福利在线播放| 成人日韩欧美| 国产精品大陆在线观看| 99re8这里有精品热视频免费| 日韩欧美99| 亚洲麻豆一区| √天堂资源在线| 久久久99久久| 日韩精品一卡二卡| 91精品啪在线观看国产60岁| 三级国产在线观看| 欧美激情乱人伦| 欧美一级在线| 欧美高清性xxxxhd| 亚洲国内精品| 亚洲在线观看网站| 欧美国产日韩a欧美在线观看| 日本亚洲色大成网站www久久| 欧美日韩一卡二卡| 久久综合九色综合久| 久久久亚洲国产天美传媒修理工| 人人玩人人添人人澡欧美| 欧美综合激情| 国产视频欧美| 中国免费黄色片| 一区二区三区四区在线播放| 97国产精品久久久| 中文字幕亚洲综合久久筱田步美| 亚洲天堂电影| 国产日韩一区欧美| 欧美特黄一区| 精品国产午夜福利在线观看| 成人免费在线视频| 伊人免费在线观看高清版| 亚洲欧美中文日韩在线| 中文字幕在线中文字幕在线中三区| 国产精品国产三级欧美二区| 午夜精品网站| 国产xxxxhd| 亚洲精品欧美综合四区| 99精品在线看| 美日韩精品视频免费看| 国产精品一区免费在线| 91香蕉视频网址| 国产伦精品一区二区三区视频青涩| 又色又爽的视频| 欧美日韩免费观看一区三区| av在线电影网| 91精品美女在线| 艳女tv在线观看国产一区| 99精品视频国产| 亚洲精品乱码久久久久久久久 | 黄色高清视频网站| 国产自产高清不卡| 国产又黄又爽又无遮挡| 日韩欧美一级二级三级| 日韩免费影院| 久久精品国产第一区二区三区最新章节| 91久久视频| av直播在线观看| 色先锋资源久久综合| 成人免费在线视频网| 国产精品香蕉在线观看| 99re6这里只有精品| 国产农村妇女精品久久| 夜色激情一区二区| 欧美zozo| 国产欧美一区二区三区四区| 888久久久| 熟妇高潮一区二区| 色婷婷一区二区| аⅴ资源新版在线天堂| 成人在线精品视频| 影音先锋国产精品| 国产又粗又猛又爽视频| 欧美日韩高清不卡| xxxx另类黑人| 日韩精品欧美一区二区三区| 久久99精品久久久久久动态图 | 三级电影在线看| 在线观看一区日韩| www在线视频| 久久久综合香蕉尹人综合网| 日本aⅴ亚洲精品中文乱码| 粉嫩av性色av蜜臀av网站| 亚洲国产精品字幕| 国产一区二区三区朝在线观看| 一本岛在线视频| 久久99国产精品视频| 欧美大尺度做爰床戏| 亚洲色图另类专区| 天天色棕合合合合合合合| 国产97在线播放| 亚洲国产精品久久久天堂| 午夜剧场免费看| 欧美日韩一区在线| 成人黄色动漫| 黄色www在线观看| 久久尤物电影视频在线观看| a在线观看视频| 国产精彩精品视频| 激情五月婷婷小说|