国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

對個geek青年的狀態機,查表純C實現的代碼修改

2019-11-06 06:37:36
字體:
來源:轉載
供稿:網友

對個geek青年的狀態機,查表純C實現的代碼修改

感謝楊福貴老師無私的開源精神,原文出處 http://blog.csdn.net/younggift/article/details/35848677 建議閱讀原文,楊老師的講解很精彩 下面貼出代碼

/*上層需要維護 1)enum state//狀態類型枚舉 2)enum message//消息類型枚舉 3)struct transition fsm[]狀態轉移表 4)實現轉移動作函數 */ #include <stdlib.h>#include <stdio.h>//#define transition_num 11//#define state_num 6typedef void (*action_foo)() ;enum state { s_stop='s', s_play='p', s_forward='f', s_backward='b', s_pause='_', s_record='r' };enum message { play, stop, forward, backward, record, pause };/* action starts */void do_stop() {PRintf ("I am in state stop and should doing something here./n");}void do_play() {printf ("I am in state play and should doing something here./n");}void do_forward() {printf ("I am in state forward and should doing something here./n");}void do_backward() {printf ("I am in state backward and should doing something here./n");}void do_pause() {printf ("I am in state pause and should doing something here./n");}void do_record() {printf ("I am in state record and should doing something here./n");}struct state_action { enum state m_state; action_foo foo;};action_foo ACTION_NOT_FOUND = NULL;struct transition { enum state current; enum message m; enum state next; action_foo transAction;};//struct transition fsm[transition_num] = {struct transition fsm[] = { /* current_state, message/event, next_state,transAction*/ {s_play, stop, s_stop ,do_stop}, {s_play, pause, s_pause ,do_pause}, {s_pause, pause, s_play ,do_play}, {s_pause, stop, s_stop ,do_stop}, {s_stop, forward, s_forward ,do_forward}, {s_stop, play, s_play ,do_play}, {s_stop, backward, s_backward ,do_backward}, {s_stop, record, s_record ,do_record}, {s_forward, stop, s_stop ,do_stop}, {s_backward, stop, s_stop ,do_stop}, {s_record, stop, s_stop ,do_stop}};int const ERR = -1;int lookup_transition (enum state s, enum message m, struct transition * t){ int ret=ERR; int i;// for(i=0;i<transition_num;++i) for(i=0;i<sizeof(fsm)/sizeof(struct transition);++i) { if(t[i].current == s && t[i].m == m) { ret = i; return ret; } } return ret;}/* transition ends*/void state_change(enum message m){ static state = s_stop; enum state next; int index = 0; index = lookup_transition(state, m, fsm); if(index!=ERR) { state = fsm[index].next; // lookup_action(state, state_action_map)(); //lookup_action fsm[index]. transAction(); } return;}int main(int argc, char *argv[]){ char c=0x00; while(1) { c = getchar(); printf ("%c input./n", c); switch(c) { case ' ': state_change(pause); break; case 'p': state_change(play); break; case 'r': state_change(record); break; case 's': state_change(stop); break; case 'f': state_change(forward); break; case 'b': state_change(backward); break; case 'q': return EXIT_SUCCESS; } } return EXIT_SUCCESS;}

建議閱讀原文,楊老師的講解很精彩

這是第一次修改。第二次修改我將狀態機引擎獨立出來,可在一個系統內支持多個狀態機代碼鏈接如下http://blog.csdn.net/happyorzking/article/details/60768874


上一篇:矩陣

下一篇:九大排序算法再總結

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 林州市| 平原县| 乌审旗| 和林格尔县| 长泰县| 东乡族自治县| 东乌珠穆沁旗| 奉节县| 玉林市| 石城县| 黎平县| 洛扎县| 韶关市| 济源市| 寿光市| 张家川| 金川县| 和顺县| 湘乡市| 贡觉县| 宿州市| 常宁市| 益阳市| 名山县| 策勒县| 兰州市| 阿克陶县| 营口市| 新巴尔虎右旗| 莒南县| 西乌珠穆沁旗| 柳州市| 六安市| 祥云县| 平乡县| 犍为县| 江安县| 盐津县| 潮安县| 德清县| 读书|