本帖最后由 donkey89 于 2011-8-11 11:53 编辑
过程很简单,功能就是把十六进制数缩小1万倍,变成十进制的字符串,例如数值15030,转换过来就是"15.030".但是居然能影响到另外一个毫不相干的函数的运行结果,我在过程的各个地方都加了限定条件,不会出现越界访问的情况
重点看第48行
str[j++]=(char)(val/m)+'0';
把这个注释掉或者把J++变成立即数都不会再出现问题了.例如
str[5]=(char)(val/m)+'0';
代码没法跟踪,到那一段自动非法错误退出
//******************
//功能:调用hex2str并显示到lcd上
//*******************
void lcd_printf_int(uint16_t n)
{
char str[9];//这个数组足够大了,实际仅仅用到7个字节而已
// char i;
// i=sprintf(str,"%d",n);
// if(i>8) str[8]='\0';
hex2str(n,str);
lcd_puts(str);
}
//***********************
//功能:数值转换成字符串的函数
//参数n:要转换的数
//参数str:转换结果存储的地方
//************************
void hex2str(uint16_t n,char *str)
{
uint16_t val,m;
char i,j;
m=10000;
val=n;
j=0;
for(i=0;i<2;i++)
{
if(val>=m)
{
str[j++]=(char)(val/m)+'0';
val%=m;
}
else if(val<n)
str[j++]='0';
m/=10;
}
if(j==0)
str[j++]='0';
str[j++]='.';
//*************以上处理的是大于1的部分**************
for(;i<5;i++)
{
if(val>=m)
{
if(j<6)
str[j++]=(char)(val/m)+'0';//这里,如果把J++换成<5的立即数,就不会影响另外一个完全不相关的函数
val%=m;
}
else if(j<6)
str[j++]='0';
m/=10;
}
//*************小数点部分*************
str[6]='\0';
}
|