2016-09-09 6 views
-3

상태 머신에서 함수에 대한 포인터를 사용 중이며 enum의 결합체에서 빌드 된 열거 형 값을 전달해야합니다. 함수 호출이있는 테이블을 사용할 때 호출/반환 값이 필요합니다.C에서 enum의 유니온 (union) 사용하기

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와 같은 열거 형 값 중 하나를 사용하고 NewFooState (F)와 같은 NewFooState 함수를 호출하기를 원한다. NewFooState (G)와 나는 오류 오류를 얻고있다 ... 너무 간단해야 [Pe167가] :

+0

G는 필드 아니다, 그것의 자신의 ID입니다. – jxh

+0

'NewFooState (G)'가 제공하는 컴파일러 오류는 무엇입니까? – aschepler

+0

jxh, 이상하게도 NewState에서 충분한 전환이 제대로 컴파일되고 작동하는 것처럼 보입니다. – MountainLogic

답변

1

FOO.D 같은 것은 형 "열거 G"의 인수 유형의 매개 변수 "는 foobar"와 호환성이 없다 . DFOO과 연결된 enum 값을 지정하는 자체 식별자입니다. 그러나 NewFooState() 함수는 FooBar이 아니라 FOO (또는 BAR)이 아닙니다. 따라서 적절한 유형의 변수가 필요합니다. 한 가지 방법이 수행 할 수 있습니다 :

FooBar FOO_D = { .Foo=D }; 
    NewFooState(FOO_D);