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.