2016-09-09 3 views
-3

Я использую указатели на функции в машинах состояния и должен передать перечисленное значение, которое построено из объединения перечислений. Поскольку я использую таблицу с вызовами функций, мне нужно, чтобы их значения call/return соответствовали. Я попытался построить это на моем локальном поле и на CodeChef с помощью GCC C 4.9.2 С codeChef Я получаю сообщение об ошибке:Использование Unions перечислений в C

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:

static FooBar oldState = {.Foo=A};

Моя проблема, похоже, использует значение перечисления, такие как FooBar.Bar.G Я пробовал все комбинации синтаксиса, которые видят для меня очевидно, такие как {.foo = G}, FooBar_t.Bar. G, Bar.G, G и т. Д., Но я не могу заставить компилятор принять его. Я просто хочу использовать одно из перечисленных значений, таких как F, и вызвать функцию NewFooState, такую ​​как NewFooState (F). Должно быть так просто ... С NewFooState (G) Я получаю ошибку ошибки [Pe167]: аргумент типа «перечисления G» несовместим с параметром типа «FooBar»

+0

G не является полем, это его собственный идентификатор. – jxh

+0

Какая ошибка компилятора 'NewFooState (G)' дает вам? – aschepler

+0

jxh, Как ни странно, включение NewState, похоже, компилируется и работает нормально. – MountainLogic

ответ

1

Там нет такого понятия, как FOO.D , D - его собственный идентификатор, который обозначает значение перечисления, связанное с FOO. Однако ваша функция NewFooState() ожидает FooBar, а не FOO (а не BAR). Итак, вам нужна переменная соответствующего типа. Один из способов сделать это можно:

FooBar FOO_D = { .Foo=D }; 
    NewFooState(FOO_D); 
Смежные вопросы