2016-02-15 134 views
-2

我在C以下代碼:函數返回值的垃圾

#include <stdio.h> 

// Global variables : 
int i; 
int x[10]; 
int Nmax; 
int sum; 

// Functions used : 
void Summation(); 
int Average(float avg); // This function will return avg 

int main() 
{ 
    float avg; 

    printf("Mention how many numbers to be added\n"); 
    scanf("%d",&Nmax); 
    printf("Enter %d numbers\n",Nmax); 
    for (i=0; i<Nmax; i++){ 
     scanf("%d",&x[i]); 
    } 

    Summation(); 

    Average(avg); 

    printf("%d %d %f\n",Nmax,sum,avg); 
    printf("Average = %.2f\n",avg); 
    return 0; 
} 

// Summation : 
void Summation() 
{ 
    sum=0; 
    for (i=0; i<Nmax; i++) { 
     sum=sum+x[i]; 
    } 
    printf("Sum of them = %d\n",sum); 
} 


// Average 
int Average(float avg) 
{ 
    avg=(float)sum/(float)Nmax; 
    return avg; 
} 

不知何故功能Average沒有返回預期的平均值。 而是顯示垃圾值。

一個典型的輸入/輸出:

Mention how many numbers to be added 
4 
Enter 4 numbers 
1 2 3 4 
Sum of them = 10 
4 10 1637156136366093893632.000000 
Average = 1637156136366093893632.00 

什麼錯嗎?希望我在這裏不需要指針或者我需要嗎?

+2

請編寫您的代碼,以便人類可以理解,如果您不知道自己在做什麼,也不要使用全局變量。 –

+1

你的'平均'函數沒有sum或NMax作爲輸入參數。 – rghome

+0

@rghome它不需要它們,因爲它們是全局變量。 –

回答

3

對於傳遞參數的平均函數,按值傳遞。一旦你調用函數,你不會將返回值賦給主函數內的avg變量。所以你打印的是在main函數中聲明的avg變量內的垃圾值。將您的代碼更改爲

avg = Average(avg); 

此外,這是編寫c程序的一種非常糟糕的方式。如果你不需要它們,請不要使用全局變量。

+0

謝謝,你有點讓我正確。好的,我認爲'平均值'參數可以傳遞給main,但不會發生在C中(與Fortran不同)。我想,我可以在函數「Average()」中使用'avg = Average()'和'return avg'。但是,我仍然得到一個錯誤的價值! 'avg = 2.0'而不是2.5! – hbaromega

+0

那是因爲你的函數有返回類型int。所以它只返回一個int值而不是一個浮點數。改變你的功能'浮動平均' –

+0

哎呀!我錯過了。謝謝。 – hbaromega

2
  1. 您在混合intfloat,這可能會導致問題。
  2. 你永遠不會初始化avgmain(),使用參數,而不是全局變量,以避免混淆。你通過avg的值到Average()它在這種情況下絕對沒有用處。

    函數的參數總是按值傳遞這樣的avg值不被在Average()修改,你可能會認爲這是因爲你似乎感到困惑的你怎麼能到處修改全局變量。事實是,全局變量是平均值,當然它們有它們的用途,例如,庫中的全局狀態可以存儲在全局變量中,但通常它們不是必需的。

嘗試這樣

#include <stdio.h> 

// Functions used : 
float Summation(float *data, int size); 
float Average(float *data, int size); // This function will return avg 

int 
main(void) 
{ 
    int size; 

    printf("Mention how many numbers to be added\n"); 
    if (scanf("%d", &size) == 1) 
    { 
     float data[size]; 
     float sum; 
     float average; 
     int i; 

     printf("Enter %d numbers\n", size); 
     for (i = 0 ; ((i < size) && (scanf("%f", &data[i]) == 1)) ; i++) 
      ; 
     size = i; 
     sum = Summation(data, size); 
     average = Average(data, size); 

     printf("%d %f %f\n", size, sum, average); 
     printf("Average = %.2f\n", average); 
    } 

    return 0; 
} 

// Summation : 
float 
Summation(float *data, int size) 
{ 
    float sum; 
    sum = 0; 
    for (int i = 0 ; i < size ; i++) 
     sum = sum + data[i]; 
    return sum; 
} 


// Average 
float 
Average(float *data, int size) 
{ 
    return Summation(data, size)/(float) size; 
} 

需要注意的是你「並不真的需要一個Average()功能。」,雖然也可以使API乾淨有用。


雖然我不喜歡,要麼,它使得在多線程環境非常有限的庫。有時候它還會生成senes,但您始終可以擁有包含所有必需數據的結構,並在每次調用庫API時傳遞它。所以全局變量非常少見。