做一个串口输出的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);
这里是好奇为什么取不到浮点,不是为其他的。 |