スポンサーリンク

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.

スポンサーリンク