我有一个使用int
的函数,比如2488
来存储温度值。我必须调用函数getTemp()
来获取int。 getTemp
函数返回double
并使用int
返回正确的数字。在这种情况下,getTemp()
所做的只有return (double)x / 100.0
,其中x
为2488
。
然后返回的双精度为24.88
。然后将此值发送到另一个将double
添加到数组的函数。函数称为DAaddDouble(double m, int x, int y)
,其中m
是要添加的值,x
和y
是指定添加double
的位置的坐标。
问题是,它变成了nan
。
double a = getTemp();
//a is correct, i.e. 24.88
DAaddDouble(a, x, y);
/*-----------inside DAaddDouble----------*/
void DAaddDouble(double m, int x, int y)
{
//at this point, a (or m, same) is 0.nan
cord = x + y*40; //where to put the double
snprintf(DARRAY[cord], 5, "%f",m);
printf(....DARRAY[cord]...);
}
输出:-nan
答案 0 :(得分:1)
函数DAaddDouble
的签名是:
void DAaddDouble(int m, int x, int y)
请注意,m
的类型为int
,在函数内部,您有:
snprintf(DARRAY[cord], 5, "%f",m);
其中%f
期望类型double
,它是未定义的行为。
您可能需要的是将参数m
设为double
(如代码上方所示)。
void DAaddDouble(double m, int x, int y)
答案 1 :(得分:0)
错配原型。
DAaddDouble()
的用法之前没有其声明/定义,因此编译器假定函数是:
int DAaddDouble(int m, int x, int y);
在函数定义或函数原型之前使用DAaddDouble()
。
void DAaddDouble(double m, int x, int y);
一个好的编译器会警告这个。确保启用所有警告。
答案 2 :(得分:0)
您如何知道m
是NAN
。如果您已将“打印”值推断为DARRAY[cord]
,请考虑格式字符串应为"%lf"
而不是"%f"
。
void DAaddDouble(double m, int x, int y)
{
//at this point, a (or m, same) is 0.nan
cord = x + y*40; //where to put the double
snprintf(DARRAY[cord], 5, "%f",m); /* should be "%lf" for printing doubles */
printf(....DARRAY[cord]...);
}