常量积分表达式需要错误

时间:2012-09-28 08:14:13

标签: c embedded switch-statement avr

我正在为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上。我已经完成了与之前使用的相同的开关案例规则。任何建议赞赏

提前致谢。

2 个答案:

答案 0 :(得分:3)

case中的值必须是常量文字

如果您查找,例如WGP您会发现它最有可能是#define'字面值。为你的新价值做同样的事。

答案 1 :(得分:1)

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

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

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

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

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

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

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

          (请注意,case语句中显示的switch值不需要在它周围加上括号。)

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