【问题标题】:Argument expects double but I need floats?参数期望双倍,但我需要浮点数?
【发布时间】:2017-06-26 21:03:21
【问题描述】:

我正在为班级编写一个二次方程根求解器。我要么得到 %f 期望参数类型为 double 但参数 2 和 3 在第 45 和 51 行具有 float 类型,要么得到 -nan 和 -inf 作为编译时的答案。我想不出任何其他方法来让它工作。我不能在这上面使用双打。只有浮点数和整数与子程序。

#include <stdio.h>
#include <math.h>

void solve_linear(int, int);
void solve_quad(int, int, int);
void solve_real(int,int, int);
void solve_complex(int, int, int);

int main (int argc, char *argv[]){
    int a, b, c;

    if (argc==4) {
        sscanf(argv[1], "%d", &a);
        sscanf(argv[2], "%d", &b);
        sscanf(argv[3], "%d", &c);
        if (a=0){
            if (b=0){
              printf("Error. A and B cannot both be 0\n");
            }
            else solve_linear(b, c);
        }
        else solve_quad(a,b,c);
    }
    else printf("Error. Must enter 3 numbers on command line.\n");
}

void solve_linear(b, c){
    float root;
    root=(float)-c/b;
    printf("%f\n", root);
}

void solve_quad(a, b, c){
    if(b*b-4*a*c<0){
        solve_complex(a,b,c);
    }
    else{
        solve_real(a, b, c);
    }
}
void solve_real(a, b, c){
      float x1, x2;
      x1=(-b+sqrt(b*b-4*a*c))/(2*a);
      x2=(-b-sqrt(b*b-4*a*c))/(2*a);
      printf("%f, %f\n", &x1, &x2);
}
void solve_complex(a, b, c){
    float x_real, x_img;
    x_real=-b/(2.0*a);
    x_img=(sqrt(abs(b*b-4*a*c)))/(2*a);
    printf("%f + %fi\n", &x_real, &x_img);
}

【问题讨论】:

  • if (a=0){ 所以'a'总是零并且除以a,它是无穷大
  • if (a=0) 总是会返回 true,你应该做的是 if (a == 0)。同样if (b == 0)
  • 感谢您注意到这一点。但是,我仍然遇到花车问题。
  • 使用void solve_quad(a, b, c){ … } 确实是老式的代码,你现在不应该编写这样的代码。 1989 年的风格很糟糕;令人震惊的是,您没有使用阻止它被接受的编译器选项。使用正确的原型符号:void solve_quad(int a, int b, int c){ … }
  • 您的问题是在您应该传递 double 值时传递指向 printf() 的指针。你有:printf("%f + %fi\n", &amp;x_real, &amp;x_img);——你需要printf("%f + %fi\n", x_real, x_img);。我想您在需要指针的scanf() 和需要读取double 值的"%lf" 和需要值的printf()"%f" 之间感到困惑(尽管"%lf" 也适用于C99 或更高版本的库)。

标签: c int double nan


【解决方案1】:

调用 printf 后,所有浮点参数都会自动转换为双精度。这是你无法阻止的。

启用编译器的警告,它们会告诉你 printf 需要直接值而不是指针,所以代码应该是 printf("%f +%f = %f\n", a, b, a + b);

这就是区别:scanf 需要指针(因为它写入变量),pintf 只需要值本身(所以不需要指针)。

【讨论】:

    猜你喜欢
    • 2022-07-25
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2018-03-19
    • 2019-10-16
    相关资源
    最近更新 更多