enumとswitch文を使って状態遷移を実現
enumで状態を定義して、switch文を使って状態遷移を実現できますね。
良くみられる手法だと思います。
enumとswitch文を使うことで、可読性が格段に上がります。
例えば、下記のように、enumで状態を4つ定義します。
typedef enum{
ST_1ST,
ST_2ND,
ST_3RD,
ST_FINISH
}status_t;
また、下記はwhile()でループ処理をして、countの値を見て状態遷移するswitch文になります。
状態変数stを定義して、countの値でstの中身を変更します。
stの変数に応じて、case文で分岐します。
ST_1ST → ST_2ND → ST_3RD → ST_FINISH の順に状態遷移していきます。
while(1){
count++;
printf("count=%d\n", count);
switch(st){
case ST_1ST:
if(count > 4){
printf("Go to ST_2ND.\n");
st = ST_2ND;
}
break;
case ST_2ND:
if(count > 8){
printf("Go to ST_3RD.\n");
st = ST_3RD;
}
break;
case ST_3RD:
if(count > 12){
printf("Go to ST_FINISH.\n");
st = ST_FINISH;
}
break;
case ST_FINISH:
breakFlag = 1;
break;
default:
printf("No status_t\n");
}
if(breakFlag){
break;
}
}
サンプルコード
下記がサンプルコードになります。
$ cat sample.c
#include <stdio.h>
typedef enum{
ST_1ST,
ST_2ND,
ST_3RD,
ST_FINISH
}status_t;
int main(){
int st = ST_1ST;
int count = 0;
int breakFlag = 0;
while(1){
count++;
printf("count=%d\n", count);
switch(st){
case ST_1ST:
if(count > 4){
printf("Go to ST_2ND.\n");
st = ST_2ND;
}
break;
case ST_2ND:
if(count > 8){
printf("Go to ST_3RD.\n");
st = ST_3RD;
}
break;
case ST_3RD:
if(count > 12){
printf("Go to ST_FINISH.\n");
st = ST_FINISH;
}
break;
case ST_FINISH:
breakFlag = 1;
break;
default:
printf("No status_t\n");
}
if(breakFlag){
break;
}
}
printf("Finish while loop.\n");
return 0;
}
下記が実行結果になります。
$ gcc -o sample sample.c $ ./sample count=1 count=2 count=3 count=4 count=5 Go to ST_2ND. count=6 count=7 count=8 count=9 Go to ST_3RD. count=10 count=11 count=12 count=13 Go to ST_FINISH. count=14 Finish while loop.
