函数返回垃圾值

时间:2016-02-15 12:17:01

标签: c function

我在C中有以下代码:

SQL> select value from table(test_pkg.keyval_tab ('{12345=Gold}|{12346=Silver}'))
  2* where key='12346';

VALUE
--------------------------------------------------------------------------------
Silver

SQL> select key from table(test_pkg.keyval_tab ('{12345=Gold}|{12346=Silver}'))
  2  where value='Gold';

KEY
----------
12345

函数#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

这里出了什么问题?希望我这里不需要指针或做我?

2 个答案:

答案 0 :(得分:3)

对于平均函数,您将参数作为pass by value传递。一旦调用该函数,您就不会将返回值分配回main函数内的avg变量。所以你要打印的是main函数中声明的avg变量中的垃圾值。将您的代码更改为

avg = Average(avg);

这也是编写c程序的一种非常糟糕的方式。如果你不需要,请不要使用全局变量。

答案 1 :(得分:2)

  1. 您正在混合intfloat,这可能会导致问题。
  2. 您永远不会在avg中初始化main(),使用参数而不是全局变量来避免混淆。您将avg的值传递给Average(),在这种情况下它完全没用。

    函数中,函数的参数始终按值传递,因此avg中的值Average()未被修改,您可能认为这是因为您似乎对如何到处修改全局变量。事实是全局变量是意思,当然它们有它们的用途,例如,库中的全局状态可以存储在全局变量 1 中,但通常它们不是需要的。

  3. 试试这个

    #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;
    }
    

    请注意,您&#34; 确实不需要Average()功能。&#34;,尽管使API清洁可能很有用。

    1 虽然我也不喜欢它,但它使得多线程环境中的库非常有限。有时候它会生成senes,但是你总是可以拥有一个包含所有需要数据的结构,并在每次调用库API时传递它。所以全局变量很少是好的。