【问题标题】:C function not returning valueC函数不返回值
【发布时间】:2017-08-12 13:22:02
【问题描述】:

我为一个班级编写了一个程序,但遇到了问题。该程序的目的是将一组值读入一个数组,计算平均值,然后找出该数组中有多少元素大于该平均值。提供了函数原型,因此无法更改。此外,我们被指示将数组的大小初始化为 10,并在读取元素的数量超过当前大小时将大小加倍,因此无法更改。

我遇到的问题是从上述平均函数返回一个值。它本身可以正常工作(我可以在返回之前放置一个 printf 来显示计数,但是在主函数中,返回的值是 0。有没有人可以帮助解决这个问题?这越来越令人沮丧。

此外,注释的 printf 行用于检查函数返回的值。我将其注释掉而不是删除它,这样我就不必每次都重新输入。

#include <stdio.h>
#include <stdlib.h>

double average(double *ptr, int size);
int aboveaverage(double *ptr, int size, double average);

int main(int argc, char* argv[])
{
    double *ptr, avg, above, temp;
    int size = 10, i, j;
    void *tmp;
    FILE *fp;

    avg = above = 0;

    if (argc != 2)
    {
        printf("Invalid number of arguments, 2 required\n");
        return 1;
    }

    fp = fopen(argv[1], "r");
    ptr = (double *)calloc(10, sizeof(double));
    printf("Allocated 10 doubles\n");

    for (i = 0;fscanf(fp, "%lf", &temp) != EOF; i++)
    {
        if (i >= size - 1)
        {
            size*=2;    
            tmp = realloc(ptr, size);
            if (tmp == NULL)
            {
                printf("Error with realloc, exiting\n");
                return 1;
            }
            printf("Reallocated to %d doubles\n", size);
        }
        ptr[i] = temp;
        j = i;
    }

    size = j + 1;
    avg = average(ptr, size);
    above = aboveaverage(ptr, size, avg);
    //printf("%d\n", above);

    printf("%d elements are above average of %lf\n", above, avg);

    free(ptr);

    return 0; 
}

double average(double *ptr, int size)
{
    double sum;
    int i;
    while (i < size)
    {
        sum+=ptr[i];
        i++;
    }

    return (sum / size);
}

int aboveaverage(double *ptr, int size, double avg)
{
    int count=0, temp;
    for (int i = 0; i < size; i++)
    {
        temp = (int)ptr[i];
        if (temp > avg)
        count++;
    }
    return count;
}

【问题讨论】:

  • 这对您的问题没有帮助,但您的代码很好,如果您阅读realloc() 的文档,您可以稍微简化此代码。此外,您不需要强制转换 malloc()realloc() 的返回值。
  • above 应该是int。或者只是将%d elements 更改为%f elements,但我推荐前者,因为当您的函数返回int 时,为什么abovedouble 是没有意义的。
  • 在函数average 中,i 未初始化。上帝只知道你在访问什么。

标签: c function return


【解决方案1】:

所以其他答案已经指出问题出在哪里以及如何解决。

printf("%d elements are above average of %lf\n", above, avg); 

你传递 %d 作为格式字符串,然后你传递一个双精度。

这可以通过将上面声明为 int 来解决(因为这也是您的函数返回的内容)。

但我想补充一下为什么它是错误的以及为什么你得到一个零。

所以这是 var args 函数的问题。由于原型没有说明参数的类型,因此您调用 printf 假定第二个参数是 double 类型。

现在调用约定说第二个参数(如果它是浮点数或双精度)应该在 SSE 寄存器中传递(在 Windows 上的 XMM1 寄存器中)。但是由于 printf 函数看到格式字符串是 %d,所以它期望第二个参数是 int。现在 int 参数在通用寄存器中传递(在 Windows 上,第二个在 rdx 中传递)。

因此它得到一个垃圾值。

我希望这可以帮助您更好地理解问题。

【讨论】:

    【解决方案2】:

    1 个重要错误

    • 您永远不会使用realloc() 返回的值。

    你需要

    ptr = tmp;
    

    在检查 realloc() 没有返回 NULL 之后。

    【讨论】:

      【解决方案3】:

      上面的程序看起来不错。

      printf("%d 个元素高于 %lf\n", above, avg);

      在上面的行中,您使用 %d 打印双精度值可能是错误的。否则我看一切都很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-14
        • 1970-01-01
        • 2022-07-21
        • 2016-08-28
        • 2015-12-28
        • 2012-06-16
        • 2018-11-23
        相关资源
        最近更新 更多