搜索
bottom↓
回复: 10

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

[复制链接]

出0入0汤圆

发表于 2013-1-13 20:38:51 | 显示全部楼层 |阅读模式
函数是将一个float数拆分到一个数组中,

  1. #include "stdio.h"
  2. //#include "reg51.h"
  3. #include "math.h"
  4. //拆字函数
  5. //入口变量ft ,n浮点数据,小数点保留位数
  6. //传出参数 m,字符位数
  7. unsigned char tempd[20]={0,0,0,0,0,0,0,0,0,0,0,0};
  8. unsigned char SpeaData(float ft,unsigned char n)
  9. {
  10.         unsigned char i=0;
  11.         unsigned long int temp=0;
  12.         double t;
  13.         unsigned char m=0,ss=48;

  14.        
  15.         //for(i=0;i<n;i++)       
  16.         //ft=ft*pow(10,n);
  17.         //拆分整数部分
  18.         if(ft<0)
  19.         {
  20.                 tempd[m++]='-';
  21.                 ft=0-ft;
  22.                 temp=(unsigned long int)ft;
  23.         }
  24.                 for(i=0;pow(10,i)<temp;i++);

  25.                 do
  26.                 {
  27.                         t=pow(10,i-1);
  28.                         t=(double)temp/t;
  29.                         t=(unsigned int)t%10;
  30.                         tempd[m++]=(unsigned char)t+48;
  31.                         //tempd[m++]=(unsigned char)((unsigned int)(temp/(unsigned long int)pow(10,i-1))%10);

  32.                         i--;
  33.                 }while(i);
  34.                 //拆分小数部分
  35.                  if(n)
  36.                 {
  37.                 tempd[m++]='.';
  38.                 ft=ft-(long int)ft;
  39.                 ft=ft*pow(10,n);
  40.                 temp=(unsigned long int)ft;
  41.                  do
  42.                 {
  43.                         t=pow(10,n-1);
  44.                         t=(double)temp/t;
  45.                         t=(unsigned int)t%10;
  46.                         tempd[m++]=(unsigned char)t+48;
  47.                         //tempd[m++]=(unsigned char)((unsigned int)(temp/(unsigned long int)pow(10,i-1))%10);

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-1-14 08:29:29 | 显示全部楼层
这个直接用STDIO.H里面的sprintf(&Buf, "%f", value)就可以完成了。

出0入0汤圆

 楼主| 发表于 2013-1-14 08:56:59 | 显示全部楼层
Tliang 发表于 2013-1-14 08:29
这个直接用STDIO.H里面的sprintf(&Buf, "%f", value)就可以完成了。

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

出0入0汤圆

发表于 2013-1-14 09:13:53 | 显示全部楼层
guwu454 发表于 2013-1-14 08:56
哥,我这个是拆下来以后准备送到12864里面显示的,而且这个代码是写在单片机里的! ...

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

出0入169汤圆

发表于 2013-1-14 09:22:46 来自手机 | 显示全部楼层
用sprintf()是最简单的,就是对单片机来说占内存有点大。写液晶乱码检查数组是不是越界了,字符串数组别忘了结束符。

出0入0汤圆

 楼主| 发表于 2013-1-14 09:57:37 | 显示全部楼层
Tliang 发表于 2013-1-14 09:13
得,你这口气我也懒得解释了

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

出0入0汤圆

 楼主| 发表于 2013-1-14 10:14:32 | 显示全部楼层
lxvtag 发表于 2013-1-14 09:22
用sprintf()是最简单的,就是对单片机来说占内存有点大。写液晶乱码检查数组是不是越界了,字符串数组别忘 ...

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

出0入0汤圆

发表于 2013-1-14 10:27:40 | 显示全部楼层
我以为是拆汉字呢,所以进来瞻仰一下......

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

出0入0汤圆

 楼主| 发表于 2013-1-14 11:11:38 | 显示全部楼层
flywater 发表于 2013-1-14 10:27
我以为是拆汉字呢,所以进来瞻仰一下......

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

让各位见笑了~

出0入0汤圆

 楼主| 发表于 2013-9-10 12:03:45 | 显示全部楼层
我擦,这个代码是我写的?我怎么忘了?我今天又在找拆字的代码

出0入0汤圆

发表于 2013-9-10 13:00:16 | 显示全部楼层
guwu454 发表于 2013-9-10 12:03
我擦,这个代码是我写的?我怎么忘了?我今天又在找拆字的代码

哈哈哈哈哈
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表