У меня небольшая проблема с переключателем и структурой.

У меня есть список всех инструкций. Эта запись хранится в структуре Instr (с тремя указателями на адрес узла - как трехадресный код)

typedef enum {
    // BUILT-IN FUNCTIONS
    insIfj16readInt,
    insIfj16readDouble,
    insIfj16readString,
    insIfj16lenght,
    insIfj16substr,
    insIfj16compare,
    insIfj16find,
    insIfj16sort,
    insIfj16print,
    //
    // MATH
    insPlus, 
    insMinus, 
    insMux, 
    insDiv, 
    //
    //COMPARE
    insEqual, 
    insNotEqual, 
    insLess, 
    insLessOrEqual, 
    insGreater, 
    insGreaterOrEqual, 
    insAssignment,
    insFunctionCall
}InstrType;

typedef struct Instr {
    BTSNode *Id1; 
    BTSNode *Id2; 
    BTSNode *Id3;
    InstrType *type;
}Instr;

Но теперь компилятор начал жаловаться на значения переключателей.

Код переключателя такой:

instrStack *instrStack;
    // Pointer on instruction
    struct Instr *instruction;
    // Taking the first instruction from the instruction stack
    instruction = instrStackTop(instrStack);

    while(instruction != NULL) {
        instruction = instrStackTop(instrStack);

        switch (instruction->type) {
            // BUILT-IN FUNCTIONS

            case  insIfj16readInt:
                if(instruction->Id3->inc == 1) {
                    if (instruction->Id3->data.type == var_int) {
                        instruction->Id3->data.value.intValue = readInt();

                    } else {
                        throwException(4,0,0);
                    }

                } else {
                    throwException(8, 0, 0);
                }
                break;
            case insIfj16readString:

         etc. etc. more code and so one.

Итак, компилятор жалуется:

"В параметре switch вместо InstrType * требуется целочисленное выражение

Я действительно не знаю, почему это происходит. Я использую ту же «систему» с переключателем и перечислением на моем лексическом анализаторе (я просто меняю состояния автомата), и с этим нет никаких проблем.

2
John 25 Ноя 2016 в 17:55

2 ответа

Лучший ответ

В вашем коде instruction->type имеет тип InstrType *. Вам нужен еще один уровень разыменования.

Что-то вроде

 switch ( *(instruction->type) )

Должен сделать работу.

4
Sourav Ghosh 25 Ноя 2016 в 14:57

Вы - InstrType * (т.е. указатель) в контексте, где ожидается целочисленный тип (которым является enum), что недопустимо.

Не видя остальной части вашего кода, я держу пари, что поле type, скорее всего, не нуждается в указателе на InstrType (т.е. на InstrType *), а только на {{X3} }.

typedef struct Instr {
    BTSNode *Id1; 
    BTSNode *Id2; 
    BTSNode *Id3;
    InstrType type;
}Instr;
3
dbush 25 Ноя 2016 в 15:03