state.c

来自「实现Linux状态转移功能」· C语言 代码 · 共 98 行

C
98
字号
#include<stdio.h>
#include<stdlib.h>
#define A  10
#define B  20
#define D  40
#define AB 1020
#define BA 2010
#define BD 2040
#define DB 4020
#define AD 1040
#define DA 4010
#define AA 1010
#define act1 1
#define act2 2

struct statepoint
{
int atstate;
int event;
int nextstate;
int action;
};
struct statepoint currentpoint;
struct statepoint statemachine[4];
int tablelookup(int state,int event)
{
 int i;int nextstate;
 for(i=0;i<4;i++)
 {
 
 if(state==statemachine[i].atstate && event==statemachine[i].event)
 {
  nextstate=statemachine[i].nextstate;
  currentpoint.nextstate=statemachine[i].nextstate;
  currentpoint.action=statemachine[i].action;
 }
 return(nextstate); 
 } 
}

printtable()
{
printf("%d %d %d\n",statemachine[0].atstate,statemachine[0].event,
                  statemachine[0].nextstate,statemachine[0].action );

printf("%d %d %d\n",statemachine[1].atstate,statemachine[1].event,
                       statemachine[1].nextstate,statemachine[1].action);

printf("%d %d %d\n",statemachine[2].atstate,statemachine[2].event,
                        statemachine[2].nextstate,statemachine[2].action);

printf("%d %d %d\n",statemachine[3].atstate,statemachine[3].event,
                        statemachine[3].nextstate,statemachine[3].action);

} 
machineinit()
{
 statemachine[0].atstate=A;
 statemachine[0].nextstate=D; 
 statemachine[1].atstate=A;
 statemachine[1].nextstate=B;
 statemachine[2].atstate=D;
 statemachine[2].nextstate=B;
 statemachine[3].atstate=B;
 statemachine[3].nextstate=D;
 
 statemachine[0].event=AD;
 statemachine[1].event=AB;
 statemachine[2].event=DB;
 statemachine[3].event=BA;
 statemachine[0].action=act1;
 statemachine[1].action=act1;
 statemachine[2].action=act1;
 statemachine[3].action=act2;
 printtable();

}
main()
{
 int i; 
 machineinit();
 printf("what state?");
 scanf("%d,&currentpoint.atstate");
 printf("The state is %d\n",currentpoint.atstate);
 printf("what event?");
 scanf("%d",&currentpoint.event);
 printf("The event is %d\n",currentpoint.event);
 for(i=1;i<=5;i++)
 {
 currentpoint.nextstate=tablelookup(currentpoint.atstate,currentpoint.event);
 currentpoint.atstate=currentpoint.nextstate;
 printtable();
 scanf("%d",&currentpoint.event);
 printf(" Incoming event is %d \n",currentpoint.event);
 } 

} 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?