簡體   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