感谢杨福贵老师无私的开源精神,原文出处 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
新闻热点
疑难解答