亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

第二次修改狀態機源碼

2019-11-06 06:02:42
字體:
來源:轉載
供稿:網友

第二次修改把狀態機引擎獨立出來,解決函數的可重入問題,同時可以支持多個狀態機。 下面貼出代碼:

//main.c#include <stdlib.h>#include <stdio.h>#include "state_engine.h"#include "fsm1.h" #include "fsm2.h"extern struct fsm_T fsm1;extern struct fsm_T fsm2;int main(int argc, char *argv[]){ char c=0x00; while(1) { c = getchar(); PRintf ("%c input./n", c); switch(c) { case '1': state_change(msg_pause,&fsm1); break; case 'p': state_change(msg_play,&fsm1); break; case 'r': state_change(msg_record,&fsm1); break; case 's': state_change(msg_stop,&fsm1); break; case 'f': state_change(msg_forward,&fsm1); break; case 'b': state_change(msg_backward,&fsm1); break; case '2': state_change(msg_pause2,&fsm2); break; case 'P': state_change(msg_play2,&fsm2); break; case 'R': state_change(msg_record2,&fsm2); break; case 'S': state_change(msg_stop2,&fsm2); break; case 'F': state_change(msg_forward2,&fsm2); break; case 'B': state_change(msg_backward2,&fsm2); break; case 'Q': return EXIT_SUCCESS; } } return EXIT_SUCCESS;}//state_engin.c/*上層需要維護 enum state//狀態類型枚舉 enum message//消息類型枚舉 struct transition fsm[]狀態轉移表 實現轉移函數 */ #include <stdlib.h>//debug#include <stdio.h>//debug#include "state_engine.h"int const ERR = -1;//int lookup_transition (int state, int msg, struct transition * fsmList)static int lookup_transition (int state, int msg, struct fsm_T * fsm){ int ret=ERR; int i; for(i=0;i<fsm->listSize;++i) { if(fsm->pList[i].current == state && fsm->pList[i].msg == msg) { ret = i; return ret; } } return ret;}/* transition ends*/void state_change(int msg,struct fsm_T * fsm){ int next; int index = 0; index = lookup_transition(fsm->state, msg, fsm); if(index!=ERR) { fsm->state =fsm->pList[index].next; fsm->pList[index]. transAction(); } printf("Null state");//debug return;}//state_engine.h#ifndef _STATE_ENGINE_H#define _STATE_ENGINE_Htypedef void (*action_foo)(void) ;struct transition //狀態轉換表結構 { int current; int msg; int next; action_foo transAction;};struct fsm_T //狀態機結構 { struct transition * pList; int listSize; //可傳進engine int state;}; //進行狀態轉換并且執行轉換函數 void state_change(int msg,struct fsm_T * fsm); #endif//fsm1.c//該文件需要用戶自己實現 #include <stdlib.h>#include <stdio.h>#include "state_engine.h"#include "fsm1.h" /* 動作轉換函數定義*/void do_stop(void) { printf ("I am in fsm1 state stop and should doing something here./n");}void do_play(void) { printf ("I am in fsm1 state play and should doing something here./n");}void do_forward(void) { printf ("I am in fsm1 state forward and should doing something here./n");}void do_backward(void) { printf ("I am in fsm1 state backward and should doing something here./n");}void do_pause(void) { printf ("I am in fsm1 state pause and should doing something here./n");}void do_record(void) { printf ("I am in fsm1 state record and should doing something here./n");}struct transition fsm1_list[] = { /* current_state, message/event, next_state, transAction*/ {s_play, msg_stop, s_stop ,do_stop}, {s_play, msg_pause, s_pause ,do_pause}, {s_pause, msg_pause, s_play ,do_play}, {s_pause, msg_stop, s_stop ,do_stop}, {s_stop, msg_forward, s_forward ,do_forward}, {s_stop, msg_play, s_play ,do_play}, {s_stop, msg_backward, s_backward ,do_backward}, {s_stop, msg_record, s_record ,do_record}, {s_forward, msg_stop, s_stop ,do_stop}, {s_backward, msg_stop, s_stop ,do_stop}, {s_record, msg_stop, s_stop ,do_stop},};struct fsm_T fsm1={fsm1_list,sizeof(fsm1_list)/sizeof(struct transition),0}; //狀態機初始化 //fsm1.h#ifndef _FSM_1_H#define _FSM_1_Henum state { s_stop, s_play, s_forward, s_backward, s_pause, s_record };enum message { msg_play, msg_stop, msg_forward, msg_backward, msg_record, msg_pause };/* action starts */void do_stop(void);void do_play(void);void do_forward(void);void do_backward(void);void do_pause(void);void do_record(void);#endif//fsm2.c//該文件需要用戶自己實現 #include <stdlib.h>#include <stdio.h>#include "state_engine.h"#include "fsm2.h" /* 動作轉換函數定義*/void do_stop2(void) { printf ("I am in fsm2 state stop and should doing something here./n");}void do_play2(void) { printf ("I am in fsm2 state play and should doing something here./n");}void do_forward2(void) { printf ("I am in fsm2 state forward and should doing something here./n");}void do_backward2(void) { printf ("I am in fsm2 state backward and should doing something here./n");}void do_pause2(void) { printf ("I am in fsm2 state pause and should doing something here./n");}void do_record2(void) { printf ("I am in fsm2 state record and should doing something here./n");}struct transition fsm2_list[] = { /* current_state, message/event, next_state, transAction*/ {s_play2, msg_stop2, s_stop2 ,do_stop2}, {s_play2, msg_pause2, s_pause2 ,do_pause2}, {s_pause2, msg_pause2, s_play2 ,do_play2}, {s_pause2, msg_stop2, s_stop2 ,do_stop2}, {s_stop2, msg_forward2, s_forward2 ,do_forward2}, {s_stop2, msg_play2, s_play2 ,do_play2}, {s_stop2, msg_backward2, s_backward2 ,do_backward2}, {s_stop2, msg_record2, s_record2 ,do_record2}, {s_forward2, msg_stop2, s_stop2 ,do_stop2}, {s_backward2, msg_stop2, s_stop2 ,do_stop2}, {s_record2, msg_stop2, s_stop2 ,do_stop2},};struct fsm_T fsm2={fsm2_list,sizeof(fsm2_list)/sizeof(struct transition),0}; //狀態機初始化 //fsm2.h#ifndef _FSM_2_H#define _FSM_2_Henum state2 { s_stop2, s_play2, s_forward2, s_backward2, s_pause2, s_record2 };enum message2 { msg_play2, msg_stop2, msg_forward2, msg_backward2, msg_record2, msg_pause2 };/* action starts */void do_stop2(void);void do_play2(void);void do_forward2(void);void do_backward2(void);void do_pause2(void);void do_record2(void);#endif

下面是第一次修改的鏈接 http://blog.csdn.net/happyorzking/article/details/60580751

下面是楊福貴老師的講解鏈接 http://blog.csdn.net/younggift/article/details/35848677


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
都市激情亚洲色图| 日韩动漫免费观看电视剧高清| 高跟丝袜欧美一区| 欧美做受高潮电影o| 亚洲成成品网站| 日韩av网站在线| 亚洲人成电影网站色…| 亚洲图片在线综合| 国产69精品久久久久9| 日韩在线播放一区| 日韩精品免费综合视频在线播放| 亚洲日本中文字幕免费在线不卡| 91在线网站视频| 欧美富婆性猛交| 国产精品亚洲精品| 国产欧美一区二区白浆黑人| 欧美成人午夜剧场免费观看| 美女视频黄免费的亚洲男人天堂| 在线播放亚洲激情| 日日狠狠久久偷偷四色综合免费| 538国产精品一区二区在线| 午夜精品久久久久久久久久久久| 国产xxx69麻豆国语对白| 国产热re99久久6国产精品| 日韩电影在线观看永久视频免费网站| 中文字幕日韩有码| 欧美激情精品久久久久| 91av福利视频| 久久露脸国产精品| 精品国产精品三级精品av网址| 欧美激情a在线| 亚洲国产私拍精品国模在线观看| 午夜精品福利在线观看| 欧美精品国产精品日韩精品| 成人黄在线观看| 欧美高跟鞋交xxxxhd| 日韩一级裸体免费视频| 欧美日韩精品中文字幕| 欧美有码在线观看视频| 国产美女精品免费电影| 91视频免费网站| 久久成人人人人精品欧| 国产成人一区二区| 91av免费观看91av精品在线| 中文字幕亚洲图片| yellow中文字幕久久| 亚洲国语精品自产拍在线观看| 少妇av一区二区三区| 91美女高潮出水| 大桥未久av一区二区三区| 亚洲乱码国产乱码精品精天堂| 亚洲成人久久网| 欧美日韩中文字幕在线视频| 色噜噜狠狠色综合网图区| 九九久久久久99精品| 国产免费一区二区三区在线观看| 国产精品情侣自拍| 岛国av一区二区在线在线观看| 欧美性猛交xxxx偷拍洗澡| 亚洲人成在线观看| 亚洲欧洲第一视频| 亚洲人成在线观看网站高清| 一本大道香蕉久在线播放29| 国产精品国语对白| 国产日韩精品视频| 欧美丝袜第一区| 色偷偷噜噜噜亚洲男人的天堂| 亚洲精品白浆高清久久久久久| 欧美性xxxx极品hd欧美风情| 国产成人a亚洲精品| 日韩高清av在线| 亚洲国产成人久久综合| 久久在线视频在线| 久久99久久久久久久噜噜| 成人久久久久久| 久久国产精品电影| 清纯唯美亚洲综合| 在线看日韩av| 亚洲欧美制服另类日韩| 久久九九全国免费精品观看| 欧美成年人视频网站欧美| 国产91网红主播在线观看| 亚洲香蕉成视频在线观看| 中文字幕久久亚洲| 日韩福利视频在线观看| 久久久久久久久久久国产| xxxxx91麻豆| 日本高清视频精品| 57pao成人国产永久免费| 国产精品h片在线播放| 琪琪亚洲精品午夜在线| 日日骚av一区| 欧美日韩国产成人高清视频| 亚洲视频axxx| 日韩欧美精品中文字幕| 欧美激情aaaa| 国产日韩欧美在线| 欧美日本亚洲视频| 国产精品伦子伦免费视频| 亚洲女成人图区| 欧美视频在线观看免费网址| www.久久久久| 91精品国产免费久久久久久| 久久成人在线视频| 欧美成人午夜剧场免费观看| 国产精品一二三视频| 国产精品天天狠天天看| 性金发美女69hd大尺寸| 国产精品极品美女在线观看免费| 亚洲国产成人精品女人久久久| 精品国产网站地址| 亚洲综合在线做性| 欧美日韩中文在线观看| 欧美日韩在线视频首页| 国产精品久久久久久久久借妻| 国产欧美韩国高清| 国产精品久久久久免费a∨大胸| 国产91网红主播在线观看| 国产精品99久久久久久久久久久久| 高清欧美性猛交| 欧美亚洲在线观看| 97超碰色婷婷| 日韩欧美在线视频| 亚洲伦理中文字幕| 欧美激情xxxx性bbbb| 91国产精品视频在线| 97视频在线观看免费| 国产999视频| 日韩成人小视频| 麻豆一区二区在线观看| 97婷婷涩涩精品一区| 91精品免费视频| 久久99热精品| 日韩电影免费在线观看中文字幕| 亚洲香蕉成人av网站在线观看| 夜夜嗨av一区二区三区免费区| 亚洲欧美精品suv| 亚洲高清一区二| 久久久久久久久国产精品| 成人国产精品免费视频| 国产成人激情小视频| 91精品国产91久久久久久吃药| 欧美一区二区三区图| 欧洲亚洲女同hd| 俺去了亚洲欧美日韩| 国产精品久久久久久久久久久新郎| 精品久久久视频| 色综合导航网站| 色99之美女主播在线视频| 国产精品丝袜高跟| 在线亚洲欧美视频| 久久久久久久久久久成人| 欧美精品精品精品精品免费| 国产va免费精品高清在线| 国产欧美日韩精品丝袜高跟鞋| 成人h视频在线| 姬川优奈aav一区二区| 亚洲男人7777| 亚洲免费视频在线观看| 欧美日韩在线视频观看| 国产精品入口日韩视频大尺度| 538国产精品视频一区二区| 亚洲精品理论电影| 日韩欧美在线视频观看|