2012-05-03 51 views
0

我寫了這個功能來計算平均的一些floats.But它在,而在「平均」 function.What問題出在它的最後一行運行時錯誤?功能的變量參數運行時錯誤

#include <stdarg.h> 
#include <stdio.h> 



float average(float first , ...) 
{ 
    int count = 0; 
    float sum = 0 , i = first; 

    va_list marker; 

    va_start(marker , first); 
    while(i != -1) 
    { 
     sum += i; 
     count++; 
     i = va_arg(marker , float); 
    } 

    va_end(marker); 
    return(sum ? (sum/count) : 0); 
} 


int main(int argc , char* argv[]) 
{ 
    float avg = average(12.0f , 34.0f); 

    printf("The average is : %f\n" , avg); 
    scanf("a\n"); 
} 
+1

從個人的經驗,我發現,具有可變數量的參數功能造成更多的麻煩比他們的價值 - 尤其是在使用C++作爲周圍有這更好的(恕我直言)方式。 –

+1

特別是使用'-1'作爲標記是非常糟糕的設計,這可能是一個有效的值。由於所有的參數都應該具有相同的類型,因此C++以及C爲您提供了更好的選擇。 –

回答

2

你忘了結束與-1通話,讓您的while循環會導致不確定的行爲,因爲它試圖繼續得到比你傳遞更多的參數。它應該是:

float avg = average(12.0f, 34.0f, -1f); 

此外,float參數都提升到double被傳遞給可變參數函數時,所以你不能用va_arg使用float。您應該使用double這一切:

double average(double first, ...) 
{ 
    int count = 0; 
    double sum = 0, i = first; 

    va_list marker; 

    va_start(marker, first); 
    while(i != -1) 
    { 
     sum += i; 
     count++; 
     i = va_arg(marker, double); 
    } 

    va_end(marker); 

    return sum ? sum/count : 0; 
} 

double avg = average(12.0, 34.0, -1.0); 
+0

它的工作。但反正有沒有在傳遞的參數中使用-1? –

+1

@阿爾曼 - aegit功能需要以某種方式知道什麼時候停止提取參數(即何時停止'while'循環)。因此,您必須像現在一樣在最後給出一個值,或者像添加第一個參數那樣提供您想要求和的參數數量。因此,它會像'雙平均(詮釋計數,...)',你可以做'雙平均=平均(3,1.0,2.0,3.0);'。不幸的是,沒有自動的方法來知道有多少參數被傳遞。 –

4

功能循環,直到它看到一個-1,呼叫者不供應-1

在我的盒子該名男子頁承諾 「隨機誤差」:

va_arg() 
    ... 
    If there is no next argument, or if type is not compatible with the 
    type of the actual next argument (as promoted according to the default 
    argument promotions), random errors will occur. 

嘗試:

float avg = average(12.0f, 34.0f, -1f); 
2

難道你不希望傳遞-1作爲最後對Arg的停止while循環?

而且,我相信浮標採用自願協議的時候,因此在改變浮動翻番將是一件好事轉換爲雙打...

2

的問題是,你不必爲你的while循環終止。你檢查-1但從未傳遞-1。你需要打電話給你average功能

float avg = average(12.0f ,34.0f, -1); 

有一個在va_arg, va_end, va_start這個例子中的一個運行的例子,顯示幾乎完全你的代碼,但使用int,而不是float的價值觀。