当前位置: 代码迷 >> 综合 >> keil下sprintf格式化浮点数导致死机
  详细解决方案

keil下sprintf格式化浮点数导致死机

热度:72   发布时间:2024-02-27 21:52:59.0

单片机:STC12C5A系统

环境:Keil

现象:调用sprintf格式化浮点数时程序死机,如:

    sprintf(dispCharArray,"%5.1f",ch_value);

解决方法:

参考了网上的说法,认为是字节对齐问题导致的,暂时采用自己实现类似sprintf功能方法来解决,代码如下:

 //不足位数的补空格
void Short2Str(char s[], int len, short val)
{char   *p;char   sign = 0;unsigned int digval;p = s;if (val < 0){//*p++ = '-';sign = 1;val = (unsigned int)(-(int)val);}p += len;*p-- = '\0';do{digval = (unsigned int)(val % 10);val /= 10;*p-- = (char)(digval + '0');}while ((val > 0) && (p >= s)); if (sign) { *p-- = '-'; }//将负号加到数据前面while (p >= s) { *p-- = ' '; } }
//不足规定位数的前面补'0‘
void Short2StrBy0(char s[], int len, short val)
{char   *p;char   sign = 0;unsigned int digval;p = s;if (val < 0){//*p++ = '-';sign = 1;val = (unsigned int)(-(int)val);}p += len;*p-- = '\0';do{digval = (unsigned int)(val % 10);val /= 10;*p-- = (char)(digval + '0');}while ((val > 0) && (p >= s)); if (sign) { *p-- = '-'; }//将负号加到数据前面while (p >= s) { *p-- = '0'; } }
void Float2Str(char s[], int len,int digits, float valf)
{int mlen=len;short m=(short)valf;				//整数部分short n=0;							//小数部分	if(digits>3)digits=3;if(digits==0)						//如果小数位数为0,则直接返回整数部分{		Short2Str(s,mlen,m);return;}else if(digits==1)n=((short)(fabs(valf)*10))%10;else if(digits==2)n=((short)(fabs(valf)*100))%100;else if(digits==3)n=((short)(fabs(valf)*1000))%1000;	mlen=len-digits-1;Short2Str(s,mlen,m);                //格式化整数部分*(s+mlen)='.';                      //添加小数点  Short2StrBy0(s+mlen+1,digits,n);     //格式化小数部分
}

 

  相关解决方案