本帖最后由 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';
- }
|