2012-03-20 143 views
3

我一直在谷歌搜索幾個小時,但沒有運氣。正確的答案在返回之前,返回不正確

我使用標準的c,調用一個非常簡單的方法,並返回正確的值,但返回後的值是完全錯誤的。

電話:

 //declare the gross and ficaTax variables 
    double gross; 
    double ficaTax; 

    //calculate the gross and the ficaTax 
    gross = calcGross(payRate, hours); printf("%f\n", gross); //DELETE 

方法:

double calcGross(double rate, double hours){ 

    double gross; 

    //if the person didn't work more than 40 hours 
    if(hours <= 40.0){ 
      gross = hours * rate; 
    } 

    //if the person did work more than 40 hours 
    else{ 
      gross = 40.0 * rate + ((hours - 40.0) * rate * 1.5); 
    } 

    printf("%f \t", gross); 
    return gross; 
} 

我打印出來的值,並開始嘗試解決這個問題的方法,但我無法弄清楚。下面是輸出:

(正確)(不正確的,返回後)

529.600000,-858993459.000000

1371.522500,171798692.000000

100.000000,0.000000

1515.710000,171798692.000000

977.255000,1030792150.000000

5631.360000,687194767.000000

7502.400000,1717986918.000000

4335.106000,584115553.000000

1924.181500,-618475291.000000

683.084000,137438953.000000

1348.424000,755914245.000000

1369.200000,-85 8993460.000000

529.600000,-858993459.000000

4441.522500,-1030792152.000000

100.000000,0.000000

1882.710000,171798692.000000

我唯一的猜測是,要麼我的雙回帖子是太長適合雙倍的長度,但是我將它存儲在一個雙重預回收中,並且打印正確。如果是這種情況,我無法弄清楚如何解決它。 我的另一個猜測是,我打印出錯後返回,但我打印它的方式相同。

我正在使用Linux和gcc編譯器(如果有的話)。任何幫助,將不勝感激。我一直在努力解決這個看似簡單的問題幾個小時。

+0

編譯器是否發出任何警告?在通話之前您是否提供了該功能的原型? – FatalError 2012-03-20 03:23:10

+0

你確定你給我們的代碼完全一樣嗎?你不可能拼錯打印出的變量名,或者在函數調用和printf()之間聲明一個新的'gross'? – 2012-03-20 03:23:44

+0

試試%lf打印雙份 – John3136 2012-03-20 03:24:54

回答

4

問題是,在第一個示例中調用calcgross()函數之前,您尚未給出函數聲明或原型。

如果沒有看到該函數的聲明/原型,C編譯器會假定它返回的是int而不是double,所以事情變得非常糟糕。

放置以下行某處調用該函數(理想情況下,你包括標題)前:使用

double calcGross(double rate, double hours); 

-Wall編譯器選項會給你這個以下警告:

test.c:73:5: warning: implicit declaration of function 'calcGross' [-Wimplicit-function-declaration] 
+0

謝謝。我將添加-Wall到我的編譯腳本。 – user1279914 2012-03-20 03:33:04

-1

愚蠢,微妙的錯誤。在這兩個地方使用「printf(」%lf「,gross)」,我會打賭問題消失:)

+1

''f''應該與'printf()'相同'%lf',因爲'float'出現在可變參數列表中時被提升爲'double'。這對scanf()很重要,因爲你正在傳遞指針。 – FatalError 2012-03-20 03:26:20

+1

我對此表示懷疑。如果函數需要可變參數,C將浮點數加倍,printf(「%f」)應該工作得很好,正如第一個值被正確打印出來一樣。 – 2012-03-20 03:27:59

+1

%f是正確的。 :D – madper 2012-03-20 03:28:15

4

最有可能的問題是,在使用它之前,您沒有聲明calcGross,編譯器將假定默認返回類型(int)。在使用之前,嘗試放置calcGross()定義。

+0

正確;相應地編輯我的斷言。謝謝! – 2012-03-20 03:45:22