guwu454 发表于 2013-1-13 20:38:51

我在51上写了一个拆字函数,很菜,请各位大神批评指教!

函数是将一个float数拆分到一个数组中,
#include "stdio.h"
//#include "reg51.h"
#include "math.h"
//拆字函数
//入口变量ft ,n浮点数据,小数点保留位数
//传出参数 m,字符位数
unsigned char tempd={0,0,0,0,0,0,0,0,0,0,0,0};
unsigned char SpeaData(float ft,unsigned char n)
{
        unsigned char i=0;
        unsigned long int temp=0;
        double t;
        unsigned char m=0,ss=48;

       
        //for(i=0;i<n;i++)       
        //ft=ft*pow(10,n);
        //拆分整数部分
        if(ft<0)
        {
                tempd='-';
                ft=0-ft;
                temp=(unsigned long int)ft;
        }
                for(i=0;pow(10,i)<temp;i++);

                do
                {
                        t=pow(10,i-1);
                        t=(double)temp/t;
                        t=(unsigned int)t%10;
                        tempd=(unsigned char)t+48;
                        //tempd=(unsigned char)((unsigned int)(temp/(unsigned long int)pow(10,i-1))%10);

                        i--;
                }while(i);
                //拆分小数部分
               if(n)
                {
                tempd='.';
                ft=ft-(long int)ft;
                ft=ft*pow(10,n);
                temp=(unsigned long int)ft;
               do
                {
                        t=pow(10,n-1);
                        t=(double)temp/t;
                        t=(unsigned int)t%10;
                        tempd=(unsigned char)t+48;
                        //tempd=(unsigned char)((unsigned int)(temp/(unsigned long int)pow(10,i-1))%10);

                        n--;
                }while(n);
                }
                return m;
}
main()
{
unsigned char n=SpeaData(-9999.12345,4);
        while(1);
}
运行发现有时候又乱码,不知道是什么地方的问题,例如我现在输入的9999.12345.拆完之后小数后面就会有乱码出现。求解!

Tliang 发表于 2013-1-14 08:29:29

这个直接用STDIO.H里面的sprintf(&Buf, "%f", value)就可以完成了。

guwu454 发表于 2013-1-14 08:56:59

Tliang 发表于 2013-1-14 08:29 static/image/common/back.gif
这个直接用STDIO.H里面的sprintf(&Buf, "%f", value)就可以完成了。

哥,我这个是拆下来以后准备送到12864里面显示的,而且这个代码是写在单片机里的!

Tliang 发表于 2013-1-14 09:13:53

guwu454 发表于 2013-1-14 08:56 static/image/common/back.gif
哥,我这个是拆下来以后准备送到12864里面显示的,而且这个代码是写在单片机里的! ...

得,你这口气我也懒得解释了

lxvtag 发表于 2013-1-14 09:22:46

用sprintf()是最简单的,就是对单片机来说占内存有点大。写液晶乱码检查数组是不是越界了,字符串数组别忘了结束符。

guwu454 发表于 2013-1-14 09:57:37

Tliang 发表于 2013-1-14 09:13 static/image/common/back.gif
得,你这口气我也懒得解释了

sorry 啊!我是菜鸟,我试一下您的函数啊!

guwu454 发表于 2013-1-14 10:14:32

lxvtag 发表于 2013-1-14 09:22 static/image/common/back.gif
用sprintf()是最简单的,就是对单片机来说占内存有点大。写液晶乱码检查数组是不是越界了,字符串数组别忘 ...

所以我做的是能够返回数据长度的,这样在现实的时候就知道要写多长了,也能确定我显示的起始位置了。

flywater 发表于 2013-1-14 10:27:40

我以为是拆汉字呢,所以进来瞻仰一下......

如果对速度要求不高,就用sprintf(),最好不过了,
如果嫌慢就 ft * ((显示有效位+1)*10),全部按整数计算,再四舍五入取舍最后一位。

guwu454 发表于 2013-1-14 11:11:38

flywater 发表于 2013-1-14 10:27 static/image/common/back.gif
我以为是拆汉字呢,所以进来瞻仰一下......

如果对速度要求不高,就用sprintf(),最好不过了,


让各位见笑了~

guwu454 发表于 2013-9-10 12:03:45

我擦,这个代码是我写的?我怎么忘了?我今天又在找拆字的代码

电子喵星人 发表于 2013-9-10 13:00:16

guwu454 发表于 2013-9-10 12:03 static/image/common/back.gif
我擦,这个代码是我写的?我怎么忘了?我今天又在找拆字的代码

哈哈哈哈哈
页: [1]
查看完整版本: 我在51上写了一个拆字函数,很菜,请各位大神批评指教!