Использование перечислений и переключателей функций (компилятор C18)

Недавно я начал переписывать программу, чтобы сделать ее более понятной, и начал использовать перечисления для описания различных состояний, в которых может находиться моя программа.

byte VoltageLimit(byte progState, word voltage)
{
    switch(progState){
        case Charge:
        case DiagCharge1:
        case DiagCharge2:
            if(voltage>ConstUMax)
                {return 1;}                  
            else 
                {return 0;}
        case Diagnose:
            if(voltage<ConstUMin)
                {return 1;}
            else 
                {return 0;}
        default:
            return 0;
    } 
}

Вот перечисление:

enum EnumProgramState
{
    Idle,
    Charging,
    Done,
    DiagCharging1,
    DiagBattery,
    DiagCharging2,
    DiagDone,
    Error
}

Я думал, что смогу передать его как байт в функцию, поскольку значения на самом деле являются целыми числами, но я не уверен, вызывает ли это проблему или что-то еще, я уже давно модифицирую эту функцию.

Ошибка, которую я получаю при компиляции (2 ошибки в одной строке), ошибка появляется всегда на первой строке, которую я пишу в конкретном случае. Я понятия не имею, что оно пытается мне сказать.

main.c:159:Error [1113] integer constant expected for case label value
main.c:159:Error [1113] integer constant expected for case label value

Вопрос: что я делаю не так, как мне заставить мой код работать?


person Grossu Iulian    schedule 23.09.2015    source источник
comment
‹sideNote›Научитесь использовать системы управления исходным кодом, поскольку они позволяют вам иметь точки сохранения, к которым вы можете легко вернуться или сравнить свой существующий код, чтобы увидеть, что изменилось с тех пор, как он работал в последний раз‹/sideNot›   -  person YePhIcK    schedule 23.09.2015
comment
этот раздел никогда не работал, однако у меня есть другой случай выбора в моей основной процедуре, который использует перечисления, и это работает.   -  person Grossu Iulian    schedule 23.09.2015
comment
Несколько советов по стилю: не используйте byte вместо progState в сигнатуре функции, но объявите его типом enum EnumProgramState — это поможет передать назначение параметра. (Вы также можете рассмотреть возможность повторного объявления перечисления как чего-то вроде typedef enum {...} ProgramState, чтобы вы могли опустить enum в таких объявлениях). Точно так же, если ваш возвращаемый тип является логическим, сделайте его BOOL или что-то в этом роде вместо byte, чтобы цель использования была более ясной. Эти изменения дадут вам: BOOL VoltageLimit(ProgramState progState, word voltage)   -  person paul    schedule 23.09.2015


Ответы (2)


Беззнаковые символы будут работать как положено. У вас есть несколько опечаток или неопределенные ярлыки:

case Charge: но перечисление заряжается

case DiagCharge1: но перечисление DiagCharging1 и т.д.

person jolati    schedule 23.09.2015
comment
Я изменил перечисление во время написания программы и забыл проверить остальную часть кода ›.‹ теперь я чувствую себя таким глупым из-за того, что упустил из виду такую ​​простую вещь, тьфу - person Grossu Iulian; 23.09.2015
comment
@GrossuIulian, не волнуйся об этом. Это своего рода ошибка, которую мы все делаем время от времени. Иногда багу просто нужно, чтобы кто-то другой посмотрел на него. Кроме того, я уверен, что перечисление и код, находящиеся так близко друг к другу в этом вопросе, значительно упростили обнаружение... - person Wouter Verhelst; 24.09.2015

Вы также можете попробовать это:

typedef enum
{
    Idle,
    Charging,
    Done,
    DiagCharging1,
    DiagBattery,
    DiagCharging2,
    DiagDone,
    Error
} ProgState;

byte VoltageLimit(ProgState xMyProgState, word voltage)
{
    switch(xMyProgState){
        case Charge:
        case DiagCharge1:
        case DiagCharge2:
            if(voltage>ConstUMax)
                {return 1;}                  
            else 
                {return 0;}
        case Diagnose:
            if(voltage<ConstUMin)
                {return 1;}
            else 
                {return 0;}
        /*
        default:
            return 0;
        */
    } 
}

Это даст вам конкретные ошибки, подобные этому:

Build error: 'Charge' undeclared (first use in this function)

и если вы прокомментируете случай default, вы сможете отслеживать это независимо от того, реализовали ли вы каждый оператор case или нет.

person Dhruv Acharya    schedule 29.09.2015
comment
Полезно знать, меня сбил тот факт, что компилятор выдал мне непонятную ошибку. Это поможет мне легче выявлять такие ошибки. - person Grossu Iulian; 01.10.2015