ステートマシンで関数へのポインタを使用しており、列挙型の値を渡す必要があります。関数呼び出しでテーブルを使用しているので、呼び出し/戻り値が一致する必要があります。Cでenumのユニオンを使用する
prog.c: In function 'main': prog.c:12:15: error: expected expression before 'FOO' NewFooState(FOO.D); // <<<<<< This is what fails!!
typedef enum Foo_t {A, B, C, D} FOO;
typedef enum Bar_t {E, F, G} BAR;
typedef union FooBar_t {FOO Foo; BAR Bar;} FooBar;
FooBar NewFooState(FooBar NewState);
//I want to later make call such as
int main(){
NewFooState(FOO.D); // <<<<<< This is what fails!!
return 0;
}
//and have that function look like:
FooBar NewFooState(FooBar NewState){
static FooBar oldState = {.Foo=A};
FooBar ReturnValue = oldState;
oldState = NewState;
switch (NewState.Foo){
case A:
case B:
case C:
case D:
//stuff
break;
}
return ReturnValue ;
}
注oldStateを初期化するために必要とされる特定の方法:私は、私はエラーを取得していますcodeChefでGCC C 4.9.2を使用して私の地元のボックスにとCodeChefでこれを構築しようとしてい
static FooBar oldState = {.Foo=A};
私の問題は、私は、このような{.fooという= G}、FooBar_t.Barとして私には明白参照構文のすべての組み合わせを試してみた列挙値などFooBar.Bar.Gを使用しているようです。 G、Bar.G、G、などが、私はそれを受け入れるコンパイラを取得することはできません。私は、Fなどの列挙値の1つを使い、NewFooState(F)などのNewFooState関数を呼び出したいだけです。私はエラーエラー[Pe167]を取得していますNewFooState(G)でとても簡単... する必要があります:タイプ「列挙型G」の引数は、型のパラメータと互換性がありません「FooBarの」
Gはフィールドではなく、それ自身の識別子です。 – jxh
'NewFooState(G)'はどのようなコンパイラエラーを引き起こしますか? – aschepler
jxh、奇妙なことに、NewStateでの切り替えがコンパイルされ、うまく動作しているようです。 – MountainLogic