C函数没有返回值

时间:2017-03-21 02:53:03

标签: c function return

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

我遇到的问题是从aboveaverage函数返回一个值。它本身可以正常工作(我可以在返回之前将printf设置为显示计数,但在main函数中,返回的值为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;
}

3 个答案:

答案 0 :(得分:3)

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

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

您将%d作为格式字符串传递,然后传递双精度。

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

但我想补充一下为什么它是错的,为什么你得到零。

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

现在调用约定说第二个参数(如果它是float或double)应该在SSE寄存器中传递(在XMM1寄存器的窗口上)。但是因为printf函数看到格式字符串是%d所以它期望第二个参数是int。现在int参数在通用寄存器中传递(在windows第二个传递在rdx中)。

结果它获得了垃圾值。

我希望这有助于您更好地理解问题。

答案 1 :(得分:1)

1个重要错误

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

你需要

ptr = tmp;

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

答案 2 :(得分:1)

上面的程序看起来很好。

printf(“%d个元素高于%lf \ n”的平均值,高于,平均值);

在上面你用%d打印双值可能是错误的。否则我看到一切都很好。