Matrixkey.c(58): error C141: syntax error near 'unsigned', expected '__asm'
Matrixkey.c(58): error C202: 'count': undefined identifier
Matrixkey.c(59): error C141: syntax error near 'double', expected '__asm'
Matrixkey.c(59): error C202: 'fractional_part': undefined identifier
出现上述报错的解决办法
今天在keil5写51单片机代码,欲实现矩阵按键实现计算机功能,在下述函数代码中遇到了奇葩的问题。
原先的代码如下:
unsigned char count_places(double number)
{
// 如果数字是整数,则返回 0
if(number == (int)number)
{
return 0;
}
unsigned char count;
double fractional_part = number - (int)number;
// 计算小数位数
while (fractional_part != 0) {
fractional_part *= 10;
fractional_part -= (int)fractional_part;
count++;
if (count > 5) { // 防止无限循环,最多处理 15 位小数
break;
}
}
return count;
}
报错如下:
我检查了很多遍,没发现有什么不对,然后也查了很多资料,才发现是定义顺序的原因。
解决方案
由于Keil、ADS等某些遵循老的C标准的编译器,在函数定义的内部,必须把所有的局部静态变量和自动变量都声明/定义了之后,然后才能开始后续的代码书写,也就是把定义放在最前面!否则编译器会报错,将代码更改如下后,编译正确。
unsigned char count_places(double number)
{
unsigned char count;
double fractional_part = number - (int)number;
// 如果数字是整数,则返回 0
if(number == (int)number)
{
return 0;
}
// 计算小数位数
while (fractional_part != 0) {
fractional_part *= 10;
fractional_part -= (int)fractional_part;
count++;
if (count > 4) { // 防止无限循环,最多处理 5 位小数
break;
}
}
return count;
}
真是令人无语的报错...