打印

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

[复制链接]
2016|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
void testFunc(char* ctrl, ...)
{
        char ctmp = 0;
int itmp = 0;
float ftmp = 0;

va_list argp;
va_start(argp, ctrl);
        ctmp = va_arg(argp, char);
        itmp = va_arg(argp, int);
        ftmp = va_arg(argp, float);
        va_end(argp);
        ctmp = ctmp?ctmp:ctmp;
        itmp = itmp?itmp:itmp;
        ftmp = ftmp?ftmp:ftmp;
}
//调用方式
   float tfp = 10.12;
   testFunc2("s",'c',12,tfp);


听别人的直接从堆栈里面取:
 
//调用2
void testFunc2(char *fmt,...)
{
    void *p;
   
    p=&fmt;           //此时*p指向字符串"yy"首址,**p是字符串第一个字符'y'。
    p=(char **)p+1;   //此时*((char *)p)为字符'y'。
    p=(char *)p+1;    //此时*((int *)p)为0x0002。
    p=(int *)p+1;     //此时*((long *)p)为0xC1480000,即-12.5的IEEE-754标准格式。
    p=(float *)p+1;
    p=p?p:p;
}

//调用方式
   float tfp = 10.12;
   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

粉丝