2

他の方法では解決できないように見えるので、これはテンプレートの質問であると確信していますが、テンプレート以外のソリューションも歓迎します。

有限ステート マシンには多数のプログラム ステートがあり、各ステートは多数のイベントに反応できます。

そこで、Event、State、FSM のクラスを定義したいと思います。FSM には状態のコレクション (おそらくベクトル、STL が組み込みシステムで問題を起こす場合はリンク リスト) があり、State にはイベントのコレクションがあります。

各状態とイベントには、ネズミイルカをデバッグするための一意の ID と名前文字列があります。

厄介なことに、ID を整数にするのではなく、列挙型の要素にしたいのです。各 FSM は、その状態とイベントに対して異なる列挙型を持っています。

これをどのようにコーディングするのが最善ですか?2 つの単純な FSM、またはそれぞれ 2 つのイベントを持つ 2 つの状態を持つ 1 つの FSm の例を挙げていただけますか?

たとえば、私が持っている場合

enum myEvents {a、b、c};
enum hisEvents {d、e、f、g};

コンストラクタ パラメータを受け入れる Event クラスを宣言できるようにしたい

(myEvents a,char *"event_a")
(hisEvents g,char* "event_g")
コンストラクターを単にオーバーロードしたくないことに注意してください。これには制限があるためです。新しいイベント列挙型が追加された場合はどうなるでしょうか。

州と同様に、FSM にそれぞれ州のリストを持たせます。

それとも、intを渡す方がはるかに簡単なのに、eventIdの列挙型を主張して、私は単に嫌悪感を抱いているだけですか?

ありがとう。


ところで、組み込みシステムでどれだけうまく機能するかについてはそれ自体が未定であるため、Boost は避けたいと思います。私は、完全に制御するために、社内で開発することを好みます。

4

2 に答える 2

2

物事を正しく理解しているかどうかはわかりませんが、試してみます。

トランジションを定義することによってステート マシンを定義する必要があると想定しています。たとえば、「状態が 'myEvents' で、'a' が 'event_a' を実行している場合」

class State {};
template<T> RealState : State
{
    static void Add(T event, char*) { /* save stuff */ }
};

class Event {};
template<T> RealEvent : Event    {
    RealEvent(T event, char* name) {RealState<T>(event, name); }
};

アクションなどを追加する必要があり、複数のステート マシンを取得するために少し手を加えたいと思うかもしれませんが、それで始められることを願っています。

于 2010-01-08T03:48:27.303 に答える
1

ステートマシンの基本を一般的に実装することでコードの冗長性を回避したい理由は理解していますが、これを自分で実装したい理由はわかりません。

Boost.Statechartなどの既存の実装や、使用シナリオに最適なものを調べてください。

于 2010-01-08T05:36:47.027 に答える