Я использую указатели на функции в машинах состояния и должен передать перечисленное значение, которое построено из объединения перечислений. Поскольку я использую таблицу с вызовами функций, мне нужно, чтобы их значения 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»
G не является полем, это его собственный идентификатор. – jxh
Какая ошибка компилятора 'NewFooState (G)' дает вам? – aschepler
jxh, Как ни странно, включение NewState, похоже, компилируется и работает нормально. – MountainLogic