[英]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.