可变参数如何获取浮点数。

[复制链接]
2669|2
 楼主| yanjinbin 发表于 2012-9-14 15:25 | 显示全部楼层 |阅读模式
tmp, ST, gp, TE, TEST
做一个串口输出的com_printf()函数。
例如:
com_printf(char *fmt,...);
以前一直用char,int这样的类型都好好的。
当是今天要用到float打印就抓瞎了。

今天用开发板子测试了浮点数的可变参数,发现一些有现象。
CPU:STM32F205
IAR:6.3版本
C语言优化等级:选择低[Low].

测试代码下:

  1. //调用1
  2. void testFunc(char* ctrl, ...)
  3. {
  4.         char ctmp = 0;
  5. int itmp = 0;
  6. float ftmp = 0;

  7. va_list argp;
  8. va_start(argp, ctrl);
  9.         ctmp = va_arg(argp, char);
  10.         itmp = va_arg(argp, int);
  11.         ftmp = va_arg(argp, float);
  12.         va_end(argp);
  13.         ctmp = ctmp?ctmp:ctmp;
  14.         itmp = itmp?itmp:itmp;
  15.         ftmp = ftmp?ftmp:ftmp;
  16. }
  17. //调用方式
  18.    float tfp = 10.12;
  19.    testFunc2("s",'c',12,tfp);


听别人的直接从堆栈里面取:

  1. //调用2
  2. void testFunc2(char *fmt,...)
  3. {
  4.     void *p;
  5.    
  6.     p=&fmt;           //此时*p指向字符串"yy"首址,**p是字符串第一个字符'y'。
  7.     p=(char **)p+1;   //此时*((char *)p)为字符'y'。
  8.     p=(char *)p+1;    //此时*((int *)p)为0x0002。
  9.     p=(int *)p+1;     //此时*((long *)p)为0xC1480000,即-12.5的IEEE-754标准格式。
  10.     p=(float *)p+1;
  11.     p=p?p:p;
  12. }

  13. //调用方式
  14.    float tfp = 10.12;
  15.    testFunc2("s",'c',12,tfp);


发现这两种方式都无法取到float参数。
各位大侠,你们试使用什么方法呢。

以下方法不讨论:
float fp= 10.12
int tmp = 0;
tmp = fp*100;             //扩大为整数
com_printf("%d",tmp);
这里是好奇为什么取不到浮点,不是为其他的。
 楼主| yanjinbin 发表于 2012-9-17 08:56 | 显示全部楼层
有人知道吗?
kseeker 发表于 2012-9-17 17:16 | 显示全部楼层
第一种 :
        ctmp = va_arg(argp, char);
        itmp = va_arg(argp, int);
        ftmp = va_arg(argp, float);
        va_end(argp);
}
//调用方式
   float tfp = 10.12;
   testFunc2("s",'c',12,tfp);
第一个参数"s"是一个32位的char *指针,而不是一个char.
第二种:
p=&fmt;           //此时*p指向字符串"yy"首址,**p是字符串第一个字符'y'。
此时*p指向的是局部变量fmt,而不是fmt所指的东西。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

50

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部