【问题标题】:Float read as double浮点读为双精度
【发布时间】:2013-09-13 06:37:42
【问题描述】:

我的代码看起来像

#include <stdio.h>
#include <math.h>
int main (void)
{ 
float x1, x2, x3;
float y1, y2, y3;
float Cos0, i, j, k, innerProduct;
float Xlength, Ylength;
x1=0;
x2=0;
x3=0;
y1=0;
y2=0;
y3=0;
Cos0=0;
i=0;
j=0;
k=0;
innerProduct=0;
Xlength=0;
Ylength=0;

printf("Please insert six floating point numbers \n");

scanf("%f%f%f%f%f%f", x1, x2, x3, y1, y2, y3);

Xlength=sqrt((x1*x1)+(x2*x2)+(x3*x3));

Ylength=sqrt((y1*y1)+(y2*y2)+(y3*y3));

i=x1+y1;

j=x2+y2;

k=x3+y3;

innerProduct=((x1*y1)*(x2*y2)*(x3*y3));

Cos0=(innerProduct)/((Xlength*Ylength));

return 0;
}

我得到以下编译错误 “警告:格式 %f 需要 'float *' 类型的参数,但参数“x”的类型为 double”

其中 x 是数字之一,scanf 命令中的所有 6 个参数都会发生这种情况,我已将所有变量指定为浮点数,但它不喜欢这样。

我该如何解决这个问题?谢谢!

【问题讨论】:

  • 您使用的是哪个编译器?我用 GCC 4.7.2 版试了一下,它编译得很好
  • 你需要传递变量的地址而不是变量本身。
  • 天啊!抓得好。 :P
  • 要获得 GCC 的警告,您需要添加一个标志(-Wall 会这样做)。

标签: c floating-point floating-point-conversion


【解决方案1】:

scanf 不能这样工作。您必须将指针传递给将保存输入的变量。

此外,在“模板”(第一个参数)中,必须以某种方式分隔占位符 - 否则 scanf 将不知道如何拆分它获得的输入。

这将起作用:

scanf ("%f %f %f %f %f %f", &x1, &x2, &x3, &y1, &y2, &y3);

有关更多信息,请阅读文档。例如,http://www.gnu.org/software/libc/manual/html_node/Formatted-Input-Functions.html 说:

函数:int scanf (const char *template, ...)

scanf 函数在模板字符串模板的控制下从流标准输入读取格式化输入。可选的 参数是指向接收结果的地方的指针 价值观。

注意“指针”部分。


另一个问题是:“为什么警告抱怨double,而我传入float”?这在 comp.lang.c 常见问题解答中得到了解答,question 15.10:

问:我有一个接受浮点参数的可变参数函数。为什么 va_arg(argp, float) 不工作吗?

A:在变长参数列表的变长部分, 旧的“默认参数提升”适用:浮点类型的参数是 总是提升(加宽)为 double 类型,以及 char 和 short int 类型 被提升为int。因此,调用永远不正确 va_arg(argp,浮点数);相反,您应该始终使用 va_arg(argp, 双倍的)。同样,使用 va_arg(argp, int) 来检索参数 最初是 char、short 或 int。 (出于类似的原因,最后 传递给 va_start 的“固定”参数不应扩展, 或者。)另见问题 11.3 和 15.2。

请注意,scanfvariadic function(或简称 varargs 函数)。

【讨论】:

  • 很好的答案,特别适合您的进一步阅读链接。这是 OP 代码出现奇怪行为的原因吗?
  • 非常感谢。我完全隔开了scanf中所需的“&”。
【解决方案2】:

您在scanf() 的第 2-7 个参数前面缺少与号,我认为这是一个非常常见的错误。 scanf() 的附加参数是指向存储找到的值的位置的指针;它需要一个引用才能保存该数据。

因此,如果没有与号,则确实存在类型不匹配。也就是说,对我来说,为什么提到 double 并不明显。

【讨论】:

    猜你喜欢
    • 2018-07-06
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多