我正在尝试使用此代码printf / sprintf浮点数:
sprintf(buff, "FPS: %d\n%.4f N %.4f E\nAl: %.1fm Rl: %.1f\n", fps, p_viewer.p.lat, p_viewer.p.lon, p_viewer.p.alt, p_viewer.roll);
但是当我这样做时,我会收到这些警告:
gfx_game_engine.c:300: warning: format '%.4f' expects type 'double', but argument 4 has type 'float'
gfx_game_engine.c:300: warning: format '%.4f' expects type 'double', but argument 5 has type 'float'
gfx_game_engine.c:300: warning: format '%.1f' expects type 'double', but argument 6 has type 'float'
gfx_game_engine.c:300: warning: format '%.1f' expects type 'double', but argument 7 has type 'float'
sprintf一个浮点数的正确方法是什么?是否有特殊的格式字符?我觉得编译器可能会以某种方式转换类型,这可能会导致它减慢速度。
我正在使用dsPIC33FJ128GP802微控制器并使用MPLAB C30进行编译,MPLAB C30是GCC v3.23的变体。
答案 0 :(得分:8)
您的gcc变体已被破坏。在C语言中,无法将float
传递给可变参数函数。小型(char
,short
和float
)的默认促销活动始终适用至少int
/ double
。我猜这个微控制器攻击gcc的人做了一些禁用促销的事情,可能是double
缓慢或难以通过的想法。你应该把它们焚烧到地狱和背部。如果编译器供应商不想正确支持double
,那么正确的解决方案是使所有浮点类型具有相同的大小并等同于float
,而不是违反该语言的升级规则。
另一个想法:sprintf
的原型也可能缺失或错误,例如int sprintf();
而不是int sprintf(char *, const char *, ...);
答案 1 :(得分:3)
float
个参数应自动转换为double
。似乎没有其他方法可以打印float
。在这种情况下,您的编译器不应该抱怨。
答案 2 :(得分:2)
与scanf
不同,其中%f
表示浮点数,%lf
表示加倍,printf
不区分它们。因此,如果通过库链接实现printf
(或其变体),则编译器必须进行转换。