-1

我正在为 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 规则。任何建议表示赞赏.

提前致谢。

4

2 回答 2

3

a 中的值case必须是常量文字

如果您查找例如WGP,您会发现它很可能是一个#define'd 字面量。对你的新价值观做同样的事情。

于 2012-09-28T08:19:39.670 回答
1

您在 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 语句更快)。

于 2012-09-28T08:44:39.570 回答