2017-03-21 216 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值可能是錯誤的。否則,我看到一切都很好。