我正在为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上。我已经完成了与之前使用的相同的开关案例规则。任何建议赞赏
提前致谢。
答案 0 :(得分:3)
case
中的值必须是常量或文字。
如果您查找,例如WGP
您会发现它最有可能是#define
'字面值。为你的新价值做同样的事。
答案 1 :(得分:1)
在switch语句中使用的值必须是编译时常量。也就是说,它们必须具有编译时编译器已知的固定值。
有四种主要方法可以做到这一点。
case 42:
请注意,建议不要使用未命名的值(“幻数”),因为它不会以任何方式记录代码,并使代码易碎(如果需要在五个不同的位置将值更改为43,该怎么办?忘了一个?)
#define COMMAND_CODE 42
...
case COMMAND_CODE:
这样更好,因为如果您需要将命令代码值更改为43,则只需更改#define(在头文件中只应出现一次)。
typedef enum { COMMAND_ON=42, COMMAND_OFF=2, COMMAND RESET=77 } command_codes:
...
case COMMAND_ON:
const int magic_number = 42;
case magic_number:
(请注意,case语句中显示的switch值不需要在它周围加上括号。)
从您显示的代码中,您似乎已将Command,ADC等定义为变量(而不是常量)。在这种情况下,编译器无法知道这些变量在编译代码时在执行时将具有的值。该语言指定在编译时必须知道case值,以便编译器可以生成快速代码(比if ... else if else if语句的整个系列更快)。