【问题标题】:Using enums and switch in functions (C18 Compiler)使用枚举和切换函数(C18 编译器)
【发布时间】:2015-09-23 16:54:47
【问题描述】:

我最近开始重写一个程序以使其更易于理解,并且我开始使用枚举来描述我的程序可能处于的不同状态。

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

问题:我做错了什么,我怎样才能让我的代码正常工作?

【问题讨论】:

  • 学习使用源代码控制系统,因为它们允许您拥有“保存点”,您可以轻松返回或比较现有代码以查看“自上次以来发生了什么变化工作”
  • 这部分一直没用,但是我的主程序中有另一个选择案例,它使用枚举并且有效。
  • 一些风格建议:不要在函数签名中将byte 用于progState,而是将其声明为enum EnumProgramState 类型——这将有助于传达意图的参数。 (您也可以考虑将枚举重新声明为 typedef enum {...} ProgramState,这样您就可以在此类声明中省略 enum)。同样,如果您的返回类型是布尔值,请将其设置为 BOOL 或其他东西,而不是 byte,这样使用意图就更清楚了。这些更改将为您提供:BOOL VoltageLimit(ProgramState progState, word voltage)

标签: enums microchip mplab c18


【解决方案1】:

无符号字符将按预期工作。您有几个拼写错误或未定义的标签:

case Charge: 但枚举正在充电

case DiagCharge1: 但枚举是 DiagCharging1 等。

【讨论】:

  • 我在写程序的时候改变了枚举,忘记检查其余的代码>.
  • @GrossuIulian,别担心。这是我们不时犯的那种错误。有时,一个错误只需要其他人来查看即可。此外,我确信这里的问题中的枚举和代码彼此如此接近,这使得它更容易被发现......
【解决方案2】:

你也可以试试这个:

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 案例,那么您可以跟踪您是否已实施每个案例语句。

【讨论】:

  • 很高兴知道,编译器给了我一个模糊的错误,这让我大吃一惊。这样做可以帮助我更轻松地识别此类错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多