2016-09-09 8 views
-3

ステートマシンで関数へのポインタを使用しており、列挙型の値を渡す必要があります。関数呼び出しでテーブルを使用しているので、呼び出し/戻り値が一致する必要があります。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の」

+0

Gはフィールドではなく、それ自身の識別子です。 – jxh

+0

'NewFooState(G)'はどのようなコンパイラエラーを引き起こしますか? – aschepler

+0

jxh、奇妙なことに、NewStateでの切り替えがコンパイルされ、うまく動作しているようです。 – MountainLogic

答えて

1

FOO.Dのようなものはありません。 Dは、FOOに関連付けられた列挙値を指定する独自の識別子です。ただし、NewFooState()関数は、FooBarではなく、FOOBAR)であると想定しています。したがって、適切な型の変数が必要です。これを行う方法の1つは:

FooBar FOO_D = { .Foo=D }; 
    NewFooState(FOO_D); 
関連する問題