可变参数列表函数,参数为float类型时会读入错误以及解决方法
2009-04-01 19:31
786 查看
我想实现类似printf的可变参数列表函数。
我的测试代码如下:
运行结果为:
Int: 123
Float: -0.000000
Double: 0.456000
Press any key to continue . . .
为什么float 类型就无法正确读入呢?而类似的double就可以正确读入。
我还是希望能用float,因为float类型是四个字节,double类型八个字节,我不能为了能正确实现就浪费那么多字节啊。
问题原因:
va_arg宏的第二个参数不能被指定为char, short或float类型。
为什么不行,暂时还不知道,需要进一步学习。
已经找到原因了:
在可变长参数中,应用的是"加宽"原则。也就是float类型被扩展成double;char, short被扩展成int。因此,如果你要去可变长参数列表中原来为float类型的参数,需要用va_arg(argp, double)。对char和short类型的则用va_arg(argp, int)。
具体可以看这里http://hi.baidu.com/mgqw/blog/item/9b7a52a2ffbbecabcaefd040.html
解决办法:
使用double类型,其实浪费4个字节也没什么关系。
如果要处理很多这样的数据,比如一个巨大的数组。
如果是那样,可以定义一个double型的临时变量,先把va_args读到这个临时变量里,再赋值给float变量。
我的测试代码如下:
#include <iostream> #include <stdio.h> #include <stdarg.h> void TestArgs( int type, ...) { va_list args; va_start(args, type); if( type == 0 ) { int i = va_arg( args, int ); printf( "Int: %d/n", i); } else if( type==1 ) { float f = va_arg( args, float ); printf( "Float: %f/n", f ); } else if( type==2 ) { double f = va_arg( args, double ); printf( "Double: %f/n", f ); } va_end(args); } int main() { TestArgs( 0, 123 ); TestArgs( 1, 0.123f ); TestArgs( 2, 0.456 ); system("pause"); return 0; }
运行结果为:
Int: 123
Float: -0.000000
Double: 0.456000
Press any key to continue . . .
为什么float 类型就无法正确读入呢?而类似的double就可以正确读入。
我还是希望能用float,因为float类型是四个字节,double类型八个字节,我不能为了能正确实现就浪费那么多字节啊。
问题原因:
va_arg宏的第二个参数不能被指定为char, short或float类型。
为什么不行,暂时还不知道,需要进一步学习。
已经找到原因了:
在可变长参数中,应用的是"加宽"原则。也就是float类型被扩展成double;char, short被扩展成int。因此,如果你要去可变长参数列表中原来为float类型的参数,需要用va_arg(argp, double)。对char和short类型的则用va_arg(argp, int)。
具体可以看这里http://hi.baidu.com/mgqw/blog/item/9b7a52a2ffbbecabcaefd040.html
解决办法:
使用double类型,其实浪费4个字节也没什么关系。
如果要处理很多这样的数据,比如一个巨大的数组。
如果是那样,可以定义一个double型的临时变量,先把va_args读到这个临时变量里,再赋值给float变量。
相关文章推荐
- C# 001 --- 正确的删除一个控件的事件函数 --- 解决错误: “A”不包含“B”的定义,并且找不到可接受类型为“A”的第一个参数的扩展方法“B”(是否缺少 using 指令或程序集引用?)
- Thin的DateChooser代码学习(关于js的函数参数为一个完整的函数以及“对象不支持此属性或方法”错误的解决)(原创,转载请声明)
- windows7下系统保护中出现错误“文件名、目录名或卷标语法不正确。(0x8007007B)“ 以及保护设置列表中出现“Windows7_os(c:)(找不到)”选项时的解决方法
- linux应用的二个错误以及解决方法整理
- MVC area出现“找到多个与名为“Home”的控制器匹配的类型”错误的解决方法
- vsFTPd修改端口以及一种错误的解决方法
- 不能将 "const char *" 类型的值分配到 "LPCWSTR" 类型的实体 错误解决方法
- apache服务器配置常见错误以及解决方法
- 关于文件不能访问,IIS提示MIME类型没有错误的解决方法
- Android 签名打包出现的错误的解决方法以及代码中获取应用签名信息方法
- 【日积月累】Oracle错误总结以及解决方法
- error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int"错误的解决方法
- Eclipse 运行MapReduce 错误 以及参考解决方法
- SpringMVC + Spring + MyBatis 学习笔记:提交数据遭遇基础类型和日期类型报400错误解决方法
- Scope参数错误或没有Scope权限解决方法
- 阿里云安装mysql初始化的时候出现如下错误,以及解决方法
- 用PB6开发WINCE时常遇到的错误以及解决方法汇总
- 编译升级linux由2.4.20-8到2.6.10内核时,遇到的错误,以及解决方法
- navicat中float类型四舍五入解决方法
- redirect_uri参数错误解决方法