【问题标题】:Too many arguments to function call, What do I do?函数调用的参数太多,我该怎么办?
【发布时间】:2015-10-12 03:20:46
【问题描述】:

我正在解决我教科书中的一个问题,我需要制作一个三角形角度计算器,我习惯了 java,但我还没有 100% 使用 C,我不明白其中的逻辑。

#include <stdio.h>

static float angleB;
static float angleA;

float remainingAngle(float answer)
{
    float answer= angleA+angleB;
//redefinition of answer
 return 0;
}
//CANT TOUCH FROM HERE TO END
int main(int argc, const char * argv[]) {
    float angleA = 30.0;
    float angleB = 60.0;
    float angleC = remainingAngle(angleA,angleB);
// to many arguments to function call (referring to angleC)
    printf("the third angle is %.2f\n",angleC);
    return 0;
}     //END CANT TOUCH

我不知道在这里做什么。

【问题讨论】:

  • What do I do?--> 提供正确数量的参数。期间。
  • 剩余角度的参数太多,而不是 printf。
  • 关于这种线:'float angleA = 30.0;'变量'angleA'声明为float,所以初始化值也需要声明为float;建议:'浮角A = 30.0f;'注意尾随的“f”。发布的代码使用“双”初始化程序(初始化程序中的小数点为双精度时的默认设置,除非通过尾随“f”特别声明)

标签: c macos function argument-passing function-calls


【解决方案1】:

在你的函数定义中

float remainingAngle(float answer)

函数remainingAngle()接受一个参数。

OTOH,在你的函数调用中

remainingAngle(angleA,angleB);

你传递了两个参数。

提供的参数编号和类型应与函数定义中的参数列表匹配。


也就是说,你的代码是错误的。

  • 第 1 点。您的局部变量将隐藏全局变量。也许那不是你想要的。改变

    float angleA = 30.0;
    float angleB = 60.0;
    

     angleA = 30.0;
     angleB = 60.0;
    
  • 第 2 点。函数

    float remainingAngle(float answer)
    {
        float answer= angleA+angleB;
    //redefinition of answer
     return 0;
    }
    

    逻辑错误。应该是

    float remainingAngle(void)
    {
        float answer= angleA+angleB;
        return answer;
    }
    

    应该这样称呼

    float angleC = remainingAngle();
    

编辑后:

根据你的要求,你可以做

float remainingAngle(float angleA, float angleB)
{
    float answer= angleA+angleB;
    return answer;
}

但是,这会使全局变量无用。

【讨论】:

    【解决方案2】:

    除了 Souravs 的回答,您还可以执行以下操作:

    float remainingAngle(float angA, float angB)
    {
        float answer = angA + angB;
        return answer;
    }
    

    因此您的通话将保持不变。

    从逻辑上讲,你要做的是:

    您将两个参数(angleA 的值和angleB 的值)传递给函数remainingAngle。您在那里进行计算并返回结果 (answer)。

    【讨论】:

    • 你是对的,但在这种情况下,angleAangleB 是全局的,不需要作为参数传递。 :-)
    • 我知道,我只是这样写,以防变量不是全局的。然后他也知道是怎么回事了。
    • 我想我明白了,我接受了你的建议,移除了静态浮点数,并将返回函数更改为“180-answer”,这样角度与 a+b 的增加成反比”
    【解决方案3】:

    你的函数设计不好:

    static float angleB;
    static float angleA;
    
    float remainingAngle(float answer)
    {
        float answer= angleA+angleB;
    //redefinition of answer
     return 0;
    }
    

    我该怎么办?

    • 回答没有意义;答案是你想要收到的。 (也没有必要为答案传递“空格”。分析器是 float,一个标量变量。只需传递它。)删除 answer 参数。
    • 您将answer 重新定义为局部变量。删除同名参数后,重新定义就消失了。但在这种情况下,您应该返回 answer 而不是 0。您甚至可以不使用中间变量 answer 并返回结果表达式。所以:返回所需的表达式
    • 答案取决于两个全局变量。该函数应该在您作为参数传递的两个角度上工作。 为您的函数提供两个角度参数并删除全局变量。
    • 最后,三角形中三个角的和是 180°,所以你的剩余角计算是错误的。

    将所有这些放在一起:

    float remainingAngle(float a, float b)
    {
        return 180.0f - a - b;
    }
    

    然后这样称呼它:

    float angleC = remainingAngle(angleA, angleB);
    

    我习惯了java

    我对 Java 不太熟悉,但我认为像这样的标量上的函数在 C 和 Java 中没有根本的不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多