質問
私は迷ったら誰もが知るのも良いチュートリアル、インターネットの開発状況ます。や電子書籍?
したまま作業状態機械ので、何か一般的だ。
解決
状態は非常に簡単にCをご利用の場合関数ポインタ.
基本的に必要な2つの配列をひとつの状態の関数ポインタと状態遷移ルール毎状態で機能を返しますコードは、ルックアップ状態遷移表の状態を返しコードの次の状態を、それかを設定することができます。
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()
として機能するようにします。
こんな状態機械のための年とする。
他のヒント
私は巨大なswitch
文の上に関数ポインタを使用して好むが、 qrdlの答え私は、通常、明示的なリターンコードまたは遷移表を使用しないでください。
また、ほとんどの場合、あなたはメカニズムが追加データに沿って通過することをお勧めします。ここでは例のステートマシンがあります:
#include <stdio.h>
struct state;
typedef void state_fn(struct state *);
struct state
{
state_fn * next;
int i; // data
};
state_fn foo, bar;
void foo(struct state * state)
{
printf("%s %i\n", __func__, ++state->i);
state->next = bar;
}
void bar(struct state * state)
{
printf("%s %i\n", __func__, ++state->i);
state->next = state->i < 10 ? foo : 0;
}
int main(void)
{
struct state state = { foo, 0 };
while(state.next) state.next(&state);
}
ステートマシンは、本質的に説明したり、使用するチュートリアルを必要なものではありません。私がお勧めすることは、あなたがデータを見てみることにし、それを解析する必要がある方法です。
コードは、C ++を使用して書かれ、そして ParseFCU のとして入手可能です。あなたが見ることができるように、それは我々が最初に検出し解析しているどのバージョン、およびそこから、2台の異なる状態マシンを入力します。
これは、その時点で我々が解析し、我々は我々のいずれかの次の状態への移行に遭遇、または以前の状態に戻って何文字に応じて起動、既知の良好な状態のステートマシンに入ります。これは基本的に、コードデータが格納されているか否か、特定のデータが全ての偶数
に存在しているように自己適応させることができ その単一のログ書き込みの終了バイトが発見された場合、は私の例では、GPS列をスキップすることができるので、GPS列処理、フライトコンピュータがログインするための要件ではない。
ステートマシンは、書き込みにシンプルであり、一般的に私はそれが流れるべきというルールに従ってください。システムを経由する入力状態から状態への一定簡単に流れるべきます。
残念ながら、多くの記事の状態機械の記述のためのC++またはその他の言語との直接支援のための多型としてでもモデルの状態は、FSM実施しての授業から得られる抽象的な状態です。
しかしいですが実施状態機械のCのいずれかを使スイッチ諸表の派遣イベント状態(単FSMsないコード右上)テーブルまでの地図るイベント状態の推移です。
カップルのシンプルですが、あの記事の基本的な枠組みの状態機械のCはこちら
- http://www.gedan.net/2008/09/08/finite-state-machine-matrix-style-c-implementation/
- http://www.gedan.net/2009/03/18/finite-state-machine-matrix-style-c-implementation-function-pointers-addon/
編集:サイト"のメンテナンス"webアーカイブのリンク:
- http://web.archive.org/web/20160517005245/http://www.gedan.net/2008/09/08/finite-state-machine-matrix-style-c-implementation
- http://web.archive.org/web/20160808120758/http://www.gedan.net/2009/03/18/finite-state-machine-matrix-style-c-implementation-function-pointers-addon/
switch
算書に基づく状態機械をよく使うことのセットマン'hide'の力学に switch
算書(またはセットでご利用 if
/then
/else
書く switch
更なる成長を図っていくために"FSM言語を記述するためのマシンCのソースです。個人的に好みのテーブルに基づくアプローチで確実にメリットが活用されるときに特に効果簡単になり、FSMs.
その一つの枠組みの概要太陽光電池が新しいエネルギー源イワラビンに "ゲームプログラミングの宝石"第3.0(設計-一般の堅牢な愛のエンジン).
同様のセットのマクロはここで説明されてい:
いもC++でテートマシンの実装にもっとたくさんありますことを見つけることができます。私のポストポインタについて興味のある方はもちろん.
リアルタイムオブジェクト指向モデル素晴らしかったに(1994年に発表されそして今)81セント、プラス$ 3.99送料だけ少なくするために販売します。
これはあなたが知る必要があるすべてである。
int state = 0;
while (state < 3)
{
switch (state)
{
case 0:
// Do State 0 Stuff
if (should_go_to_next_state)
{
state++;
}
break;
case 1:
// Do State 1 Stuff
if (should_go_back)
{
state--;
}
else if (should_go_to_next_state)
{
state++;
}
break;
case 2:
// Do State 2 Stuff
if (should_go_back_two)
{
state -= 2;
}
else if (should_go_to_next_state)
{
state++;
}
break;
default:
break;
}
}
Cでステートマシンをhandcrafting学ぶが、私もRagelステートマシンのコンパイラを提案できるようにレッスンがたくさんある:
http://www.complang.org/ragel/する
これは、ステートマシンを定義するのは非常に簡単な方法があり、その後、あなたは、グラフを生成異なるスタイルのコード(テーブル駆動、後藤駆動型)を生成、あなたがしたい場合は、そのコードを解析、などそして、それは強力だし、することができことができます様々なプロトコルの製品コードで使用される。
ステートマシンは、複雑な問題のために非常に複雑になることがあります。彼らはまた、予期せぬバグの対象となっています。誰かがバグに遭遇したり、将来的にロジックを変更する必要がある場合彼らは悪夢になることができます。彼らはまた、続くと状態図なしでデバッグすることは困難です。構造化プログラミングがはるかに優れている(たとえば、あなたは、おそらくメインラインレベルでのステート・マシンを使用することはありません)。あなたは(ステートマシンは通常使用されているところである)でも、割り込みコンテキストで構造化プログラミングを使用することができます。シミュレートマルチにこの記事」マクロを参照してください。タスク/ codeproject.comで発見の割り込みレベル」でコードをブロックします。