【问题标题】:Constant integral expression required error常量积分表达式所需的错误
【发布时间】:2012-09-28 08:14:12
【问题描述】:

我正在为 AVR ATmega32-A 微控制器编写代码。我正在使用如下所示的开关盒。

  unsigned char Command;
  unsigned int  Param;

  void runCom(void){

    switch(Command){

        case(NO_COM):
            Command = 0;
            break;

        case(INF):
            printf("\r\n\r\n");
            printf("university\r\n");
            printf("sweden\r\n");
            printf("Ver. 1.0A\r\n");

            Command = 0;
            break;

        case (DB):                        
            Command = 0;
            break;


        case(CLEARM):
            Command = 0;
            break;

        default:
            Command = 0;
            break;   
    }
}

上面的代码正在运行,但现在我想在该开关中再添加一个案例,如下所示。

 unsigned char Command, Command1;
 unsigned int  Param;
 void runCom(void){

    switch(Command){

        case(NO_COM):
            Command = 0;
            break;

        case(INF):
            printf("\r\n\r\n");
            printf("university\r\n");
            printf("sweden\r\n");
            printf("Ver. 1.0A\r\n");

            Command = 0;
            break;

        case (DB):                        
            Command = 0;
            break;



         case(ADC):
             printf("ADC Value",ReadAd()); 

             printf("Enter Amplification stage");

                       switch(Command1){

                              case(stage1):
                                    PORTC=0x00;
                                    DDRC=0xC0; 
                                    printf("ADC Value",ReadAd());
                                    Command1 = 0;  
                                    break;

                                    case(stage2):
                                    PORTC=0x00;
                                    DDRC=0x03; 
                                    printf("ADC Value",ReadAd());
                                    Command1 = 0;  
                                    break;
                                   }    
            Command = 0;
            break; 

        case(MEM):
            Command = 0;
            break;

        case(CLEARM):
            Command = 0;
            break;

        default:
            Command = 0;
            break;   
    }
}

我收到类似

的错误
   undefind symbol 'ADC'
   undefind symbol 'stage1'
   undefind symbol 'stage2'

然后我就这样声明了

unsigned char Command, ADC, Command1, stage1, stage2;
  unsigned int  Param;

现在我遇到了类似的错误

constant integral expression required at line case(ADC)
constant integral expression required at line case(stage1)
constant integral expression required at line case(stage2)

所以请任何人建议我如何克服这个错误。我没有在任何地方声明 WGP、WGF、INF,但我没有得到“WGF、WGP、INF 的未定义符号。为什么这个错误只发生在 ADC 上。我已经放弃了与以前使用的相同的 switch case 规则。任何建议表示赞赏.

提前致谢。

【问题讨论】:

  • 这是在 www.avrfreaks.net 上提出的同一问题的交叉帖子。

标签: c embedded switch-statement avr


【解决方案1】:

case 中的值需要是 constantsliterals

如果你抬头看,例如WGP 你会看到它很可能是 #define'd 文字。对你的新价值观做同样的事情。

【讨论】:

    【解决方案2】:

    在 switch 语句的情况下使用的值必须是编译时常量。也就是说,它们必须具有编译器在编译时已知的固定值。

    有四种主要方法可以做到这一点。

    1. 您可以使用常量文字(数字)。
       case 42:
    

    请注意,不建议使用未命名的值(“幻数”),因为它不会以任何方式记录代码,并且会使代码变得脆弱(如果您需要在五个不同的地方将值更改为 43,该怎么办?忘记一个?)

    1. 您可以使用预处理器常量。
       #define COMMAND_CODE 42
       ...
    
       case COMMAND_CODE:
    

    这更好,因为如果您需要将命令代码值更改为 43,您只需更改 #define(它应该只出现一次,在头文件中)。

    1. 您可以使用枚举。
       typedef enum { COMMAND_ON=42, COMMAND_OFF=2, COMMAND RESET=77 } command_codes:
       ...
    
       case COMMAND_ON:
    
    1. 在 C++ 中,如果您的编译器相当现代,您可以使用常量:
       const int magic_number = 42;
    
       case magic_number:
    

    (请注意,case 语句中显示的开关值不需要用括号括起来。)

    从您显示的代码来看,您似乎已将 Command、ADC 等定义为变量(而不是常量)。在这种情况下,编译器在编译代码时无法知道这些变量在执行时将具有什么值。该语言规定必须在编译时知道 case 值,以便编译器可以生成快速代码(比一系列 if ... else if ... else if 语句更快)。

    【讨论】:

      猜你喜欢
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      相关资源
      最近更新 更多