1. ホーム
  2. c

ステートマシン・チュートリアル [終了しました]

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() 関数は使わない。

これは私が何年も前から行っているステートマシンのやり方です。