繁体   English   中英

带浮点函数的除法函数声明中的冲突类型错误

[英]Conflicting types error in the function declaration of a division with floating point function

这应该是一个递归函数,当 i 小于 'h' 时,它不断向 'h' 添加 1/i 的值,但是我在函数声明中不断收到冲突类型错误,我做错了什么? 它只是发生在浮动。

#include <stdio.h>

int main()
{
    int i=0, n = 5;
    float h;
    division(i, n, h);
    return 0;
}

float division(int i, int n, float h)
{
    if(i<n)
    {
        h += 1/i;
        division(i, n, h);
    }
    else
    {
        printf("the sum is: %f",h);
        return h;
    }
}

导致“类型冲突错误”的问题是在main()尝试调用它的地方没有在作用域中声明函数division() 自 C99 以来,此类函数调用不符合标准,但许多编译器提供了用于此类函数调用的隐式声明,因为这是原始 C 的行为,并通过 C90 提供支持。

然而,在这种情况下使用的隐式声明将等效于

int division(int i, int n, double h);

,与实际函数签名不匹配且不兼容。 当编译器稍后发现时,它会发出诊断信息以警告您。 可能因为这个原因它拒绝了代码 - 从问题中不清楚。

要解决这种情况,您必须在(第一次)使用之前声明该函数。 一种方法是将division的整个定义移动到main()之前,但您也可以在main()之前放置一个函数的前向声明。 这看起来类似于上面的(错误的)声明,但它会正确反映函数的真实返回类型和参数类型:

float division(int i, int n, float h);
  • 功能
float division(int i, int n, float h)

在声明之前使用,你应该在 main 之前放置一个声明,或者简单地将它移动到 main 之前。 这就是错误的原因,因为函数是隐式声明的,返回类型默认为 int 与定义冲突。

其他几个问题:

  • 在同一个函数中,并不总是保证返回。

  • 在行中

h += 1/i;

你有一个潜在的除以 0,这会导致未定义的行为

  • h未初始化使用,因为h的值未知,添加到它也会调用未定义的行为。

正如其他用户所建议的那样,其中一些问题会随着编译器警告的出现而变得明显。

在使用之前声明该函数。 要么将函数定义放在main之前,要么插入声明float division(int i, int n, float h); 在主要之前。

这在现代 C 中是必需的,但如果您不提供,一些编译器将假定默认声明。 默认声明的返回类型为int ,这与函数的实际返回类型float冲突。 这会导致错误消息。

打开编译器的警告消息并注意它们。

“冲突类型”之外的另一个问题:无限回归

如果i < n ,那么在递归调用中就是这样。

float division(int i, int n, float h) {
    if(i<n) {
        h += 1/i;  // Note: integer division, like should be 1.0f/i;
        division(i, n, h);

也许 OP 想要以下内容。 我不确定,但有些东西会改变i

        division(i+1, n, h);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM