ステートマシン・チュートリアル [終了しました]
2023-07-25 04:55:41
質問
私はちょうど誰かがステートマシンを開発するためのインターネット上のいくつかの良いチュートリアルを知っている場合、疑問に思っています。または電子書籍?
私はステートマシンに取り組み始めていて、ちょうど私を始めるために一般的なものが必要です。
どのように解決するのですか?
C言語では、ステートマシンは関数ポインタを使えば非常に簡単です。
基本的には2つの配列が必要で、1つは状態関数ポインタ用、もう1つは状態遷移規則用です。各状態関数はコードを返すので、状態遷移表を状態ごとに調べてコードを返し、次の状態を見つけ、それを実行するだけです。
int entry_state(void);
int foo_state(void);
int bar_state(void);
int exit_state(void);
/* array and enum below must be in sync! */
int (* state[])(void) = { entry_state, foo_state, bar_state, exit_state};
enum state_codes { entry, foo, bar, end};
enum ret_codes { ok, fail, repeat};
struct transition {
enum state_codes src_state;
enum ret_codes ret_code;
enum state_codes dst_state;
};
/* transitions from end state aren't needed */
struct transition state_transitions[] = {
{entry, ok, foo},
{entry, fail, end},
{foo, ok, bar},
{foo, fail, end},
{foo, repeat, foo},
{bar, ok, end},
{bar, fail, end},
{bar, repeat, foo}};
#define EXIT_STATE end
#define ENTRY_STATE entry
int main(int argc, char *argv[]) {
enum state_codes cur_state = ENTRY_STATE;
enum ret_codes rc;
int (* state_fun)(void);
for (;;) {
state_fun = state[cur_state];
rc = state_fun();
if (EXIT_STATE == cur_state)
break;
cur_state = lookup_transitions(cur_state, rc);
}
return EXIT_SUCCESS;
}
私は
lookup_transitions()
関数は使わない。
これは私が何年も前から行っているステートマシンのやり方です。
関連
-
_CRT_SECURE_NO_WARNINGS エラーメッセージ、解決方法
-
[解決済み] flexible array member not at end of structエラーの原因は何ですか?
-
[解決済み] char *とchar[]の違い [重複]
-
[解決済み] C言語の**はどういう意味ですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み] C言語でのポインタ:アンパサンドとアスタリスクはいつ使うのか?
-
[解決済み] Boost StatechartとMeta State Machineの比較
-
[解決済み] reduxとステートマシン(例:xstate)の実際の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
#137: 式は変更可能なlvalueでなければならない問題 // 文字列配列の代入問題
-
C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
-
[解決済み] Linux Socket write() によるBad File Descriptor C
-
[解決済み] なぜmemsetではなくbzeroを使用するのですか?
-
[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] C言語で関数をパラメータとして渡すにはどうすればよいですか?
-
[解決済み] printfにおけるdoubleの正しい書式指定子
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?