2017-03-21 48 views
1

我已经写了一个课程,并且遇到问题。该程序的目的是将一组值读入数组,计算平均值,然后查找该数组中有多少元素大于该平均值。函数原型被提供,所以不能被改变。此外,我们被指示将数组初始化为10,并且每当读取元素的数量超过当前大小时将其大小加倍,因此无法更改。

我遇到的问题是从aboveaverage函数返回一个值。它在它自己内部正常工作(我可以在返回前将printf显示计数,但在主函数中,返回的值是0。是否有人可以帮助解决此问题?令人沮丧

此外,该评论的printf线是检查由该函数返回的值。我评论它,而不是删除它,所以我不会每次都重新键入。C函数不返回值

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

这对你的问题没有帮助,但你的代码是好的,如果你阅读'realloc()'的文档,你可以简化这个代码。另外,你不需要传递'malloc()'或'realloc()'的返回值。 –

+0

'above'应该是'int'。或者只是将'%d元素'更改为'%f元素',但我推荐前者,因为当函数返回int时,为什么'above'是'double'。 –

+2

在函数'average'中,'i'没有被初始化。善良只知道你在访问什么。 –

回答

3

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

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

您传递%d作为格式字符串,然后传递一个double。

这可以通过声明上面的int来固定(因为这也是你的函数返回的值)。

但我想补充说明为什么它是错误的,为什么你得到一个零。

所以这是var args函数的问题。由于原型没有提供任何有关参数的类型,所以您调用printf时假定第二个参数是double类型的。

现在调用约定表明第二个参数(如果它是float或double)应该在SSE寄存器中传递(在XMM1寄存器的窗口中)。但是由于printf函数发现格式字符串是%d,所以它期望第二个参数是int。现在,int参数被传递到通用寄存器中(在窗口中,第二个是通过rdx传递的)。

因此,它会得到一个垃圾值。

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

1

1重要提示错误

  • 您从不使用realloc()返回的值。

您检查realloc()没有返回NULL之后需要

ptr = tmp; 

1

上面的程序看起来很好。 (“%d元素高于平均值%lf \ n”,以上,平均值);

上面的行中,您打印的是%d的double值可能是错误的。否则,我看到一切都很好。