プリプロセスを展開したらわかりやすいかと思ったのだけど、そもそもソース中で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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。