函数在C中指定了错误的浮点值

函数在C中指定了错误的浮点值,c,floating-point,C,Floating Point,我试图返回一个float值并将其分配给一个float变量,但新float的值与返回的值不同 float getVoltageReading() { return 1.2f; } void updateUIReadings(uint8_t menuID) { float integerReading = getVoltageReading(); // digital voltage } 在调试器中,我看到getVoltageReading返回1.2,但integerReadi

我试图返回一个float值并将其分配给一个float变量,但新float的值与返回的值不同

float getVoltageReading() {
    return 1.2f;
}


void updateUIReadings(uint8_t menuID) {
    float integerReading = getVoltageReading(); // digital voltage
}
在调试器中,我看到getVoltageReading返回
1.2
,但integerReading被指定为
1.06703091e+009


这是为什么?

您正在调用
getVoltageReading
函数,但作用域中没有活动的原型,这意味着它假设将返回
int
。从你的问题的组织方式来看,它似乎在范围之内,但我可以向你保证它不是

您可以通过以下两个文件看到,
testprog1.c

#include <stdio.h>

//float getVoltageReading(void);

int main(void) {
    float integerReading = getVoltageReading ();
    printf("%e\n", integerReading);
    return 0;
}
float getVoltageReading(void) {
    return 1.2f;
}
当这些文件被编译并链接在一起时,输出为:

1.067031e+09
因为从
getVoltageReading()
返回的浮点值被解释为
int
。如果在
testprog1.c
中取消对原型的注释,它工作正常,因为它将浮点值解释为
float

1.200000e+00

您在哪里看到不正确的值?这里的代码从不读取变量。如果实际程序中涉及到更多的代码,则至少需要发布使用
integerReading
变量的部分。Prototype不在范围内,而“implicit
int
”biting?@DanielFischer:@Arturs:在调用函数之前,在范围内获取
getVoltageReading()
的原型。。。可能通过在调用该函数的文件顶部包含声明函数的标题。您还可以通过启用完整警告和错误警告(例如,在clang或gcc中,
-Wall-Werror
,但MSVC应具有类似设置)来验证这是否是问题所在。使用完整的警告和作为错误的警告往往有助于捕获此类错误。或者简单地使用在过去14年中已更新为C标准的编译器进行编译。。。此答案中的代码将仅在过时的C编译器上编译。@Lundin,它在c99模式下的gcc上编译良好(尽管有警告)。虽然警告位可能就是您的注释的意思?
gcc test.c testprog.c-std=c99
给了我
test.c:在函数“main”中:test.c:6:5:警告:函数“getVoltageReading”的隐式声明[-Wimp合法函数声明]test.c:在顶层:test.c:11:7:错误:“getVoltageReading”测试的类型冲突。c:6:28:注意:“getVoltageReading”之前的隐式声明就在这里
GCC版本4.6.2的MinGW端口上。我在CygWin中使用了4.3.4,没有得到错误。当它们在同一个C文件中时,我确实遇到了这个错误,但是将它们分开可以进行编译。可能是gcc改进了434和462之间的检测,或者您有不同的默认选项,但我相信根据C99,代码实际上是有效的。标准在翻译单元上工作,这肯定是两个独立的单元-问题在链接阶段被实例化。