2015/09/09

[smc]idはgetId(state)でとれる

プリプロセスを展開したらわかりやすいかと思ったのだけど、そもそもソース中でidを使っている箇所が無いためか、_idで展開されるものが無かった。
うう・・・あきらめてファイルを読むことにしよう。

lib/C/statemap.hの中に、getId(state)というマクロがある。
中身は、state->_id。
では、このstateはなんだよってなると、ここでプリプロセスを展開したものが役立つ。

struct AppClassState {
    void(*EOS)(struct AppClassContext *const fsm);
    void(*One)(struct AppClassContext *const fsm);
    void(*Unknown)(struct AppClassContext *const fsm);
    void(*Zero)(struct AppClassContext *const fsm);
    void(*Default)(struct AppClassContext *const fsm);
    int _id;
};

これは、AppClass_sm.hの中にいた。

struct AppClassState {
    void(*EOS)(struct AppClassContext *const fsm);
    void(*One)(struct AppClassContext *const fsm);
    void(*Unknown)(struct AppClassContext *const fsm);
    void(*Zero)(struct AppClassContext *const fsm);
    void(*Default)(struct AppClassContext *const fsm);
    STATE_MEMBERS
};

つまりまあ、STATE_MEMBERSがint _idだってことだ。

それはよいとして、AppClassStateの本体はどこにあるのだ?
ヘッダの中では、こうなっていた。

extern const struct AppClassState Map1_Start;
extern const struct AppClassState Map1_Zeros;
extern const struct AppClassState Map1_Ones;
extern const struct AppClassState Map1_OK;
extern const struct AppClassState Map1_Error;

これは、昨日見ていた「getState」マクロだ。
つまり、こういう使い方になるようだ。

 getId(getState(&this->_fsm))

サンプルEX1で引数を"00011"としたときは、こんな順番になっていた。

./checkstring 00011
getId : 0
getId : 1
getId : 1
getId : 1
getId : 2
The string "00011" is acceptable

"0"がStart、"1"がZeros、"2"がOnesなのだろう。最後のが出力されないのは、その前にwhile()を抜けるからだ。

 

最後は、この0とか1とかが#defineで定義されていればよいだけだ。
そういうのがないと、どれが何番目かわからないが・・・えっ、ないの??
ないのか・・・自分でJARを作ってやれば出力できなくも無いだろうが・・・。

では、せめてsmファイルに書いた順番になるのであれば、あきらめて自作もできるだろう。

0 : Start
1 : Zeros
2 : Ones
3 : OK
4 : Error

では、smファイルの並びを、OK --> Ones --> Error --> Start --> Zerosに変更。

0 : OK
1 : Ones
2 : Error
3 : Start
4 : Zeros

うん、間違いなかろう。
この定義値の生成も、前回のExcelファイルに組み込んでしまいたいところだが、後日だな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。