2017-04-09 70 views
0

我從文本文件中獲得了2d數組,併成功打印出來。不過,我不能將這些元素用於函數參數。如何從2d數組中獲取元素並將它們用於c中的函數參數?

這裏是代碼打印二維數組:

fscanf(fp, "%d", &row); 
    //printf("%d\n", row); 
    array = (int**)malloc(sizeof(int*)*row); 

    for (u = 0; u < row; u++) { 
     array[u] = (int*)malloc(sizeof(int)*col); 
     for (v = 0; v < col; v++) { 
      fscanf(fp, "%d", &array[u][v]); 
      printf(" %d ", array[u][v]); 
     } 
     printf("\n"); 
    } 
    free(*array); 
    free(array); 

和功能

for (i = 0; i < row; i++) { 

     printf("Iteration GCD = %d \n", iteration(u,v)); 
     printf("Recursive GCD = %d \n", recursive(u,v)); 

} 

enter image description here

的代碼,我得到了相同的價值......儘管每個列的值是不同的。 我應該更改我的代碼源?

[全部代碼]

int iteration(int x, int y); 
int recursive(int x, int y); 


int main(void) 
{ 

    /*Define Variables*/ 

    LARGE_INTEGER timefeq, start, end; 
    int i, u, v, row; 
    int col = 2; 
    double result; 
    int **array; 


    FILE *fp = fopen("data1.txt", "r"); 

    if (fp == NULL) { 
     printf("READ ERROR!!\n"); 
     return 1; 
    } 

    else { 

     fscanf(fp, "%d", &row); 
     //printf("%d\n", row); 

     array = (int**)malloc(sizeof(int*)*row); 

     for (u = 0; u < row; u++) { 
      array[u] = (int*)malloc(sizeof(int)*col); 
      for (v = 0; v < col; v++) { 
       fscanf(fp, "%d", &array[u][v]); 
       printf(" %d ", array[u][v]); 
      } 
      printf("\n"); 
     } 
     free(*array); 
     free(array); 
    } 

    QueryPerformanceFrequency(&timefeq); 

    result = pow(2,63); 

    if ((u > result - 1) || (v > result - 1)) { 
     printf("Wrong input value!\n"); 
     return 0; 
    } 

    /* Compute */ 
    //array[u][0] = abs(u); 
    //array[0][v] = abs(v); 

    for (i = 0; i < row; i++) { 

     QueryPerformanceCounter(&start); 
     iteration(u, v); 
     printf("Iteration GCD = %d \n", iteration(u, v)); 
     QueryPerformanceCounter(&end); 

     printf("Operation time: %.4f μsec\n", 1000 * (double)(end.QuadPart - start.QuadPart)/(double)timefeq.QuadPart); 


     QueryPerformanceCounter(&start); 
     recursive(u, v); 
     printf("Recursive GCD = %d \n", recursive(u,v)); 
     QueryPerformanceCounter(&end); 

     printf("Operation time: %.4f μsec\n", 1000 * (double)(end.QuadPart - start.QuadPart)/(double)timefeq.QuadPart); 
     printf("\n------------------------------------------------------------\n"); 
    } 

     /*End Program*/ 
     fclose(fp); 
     return 0; 


} 

/*-----------------------------------------------------------*/ 
int iteration(int a, int b) { 

    int tmp; 

    while (b) { 
     tmp = a; 
     a = b; 
     b = tmp%b; 
    } 
    return a; 
} 

/*----------------------------------------------------------*/ 
int recursive(int a, int b) { 

    if (a%b == 0) 
     return b; 
    else return recursive(b, a%b); 
} 
/*--------------------------------------------------------*/ 
+0

你能發表整個代碼嗎?具體來說,在哪裏調用函數。如果它在循環之後,u和v將不會改變。 –

+1

不相關的,你的讀者代碼用於動態創建你的指針數組和每一行內的數據都在泄漏內存。計算'malloc's。有'行+ 1'的總分配,並且只有*兩個*'免費'。 – WhozCraig

+0

@AjayBrahmakshatriya我添加了整個源代碼 – Lumby

回答

1

你從來沒有通過讀取的值在你的負載循環到實際的函數調用。事實證明,這是什麼可能保持你的程序崩潰,因爲你過早釋放基指針數組array,並且只有在加載程序循環後立即分配第一行。因此,不僅array不再有效訪問,還會泄漏row-1分配(除第一個之外的所有分配)。

後來,你在好幾個地方做到這一點:

iteration(u,v); 

recursive(u,v); 

這些計算是沒有意義的。 uv保持行列計數;他們不會持有你讀到的任何實際行

剝離掉所有的Windows性能計數器克魯夫特,無謂的調用來pow(),妥善搬遷內存free電話,你的代碼應該看起來更像是這樣的:

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

int iteration(int a, int b) { 

    int tmp; 

    while (b) { 
     tmp = a; 
     a = b; 
     b = tmp%b; 
    } 
    return a; 
} 

int recursive(int a, int b) { 

    if (a%b == 0) 
     return b; 
    else return recursive(b, a%b); 
} 

int main(void) 
{ 
    int u, v, row; 
    int col = 2; 
    int **array; 

    FILE *fp = fopen("data1.txt", "r"); 
    if (fp == NULL) 
    { 
     perror("data1.txt"); 
     return EXIT_FAILURE; 
    } 

    fscanf(fp, "%d", &row); 
    array = calloc(row, sizeof *array); 
    for (u = 0; u < row; ++u) 
    { 
     array[u] = calloc(col, sizeof **array); 
     for (v = 0; v < col; v++) 
     { 
      fscanf(fp, "%d", array[u]+v); 
      printf("%d ", array[u][v]); 
     } 
     printf("\n"); 
    } 
    fclose(fp); 

    // look at the values passed to iteration and recursive below 
    for (u = 0; u < row; ++u) 
    { 
     printf("Iteration GCD = %d \n", iteration(array[u][0],array[u][1])); 
     printf("Recursive GCD = %d \n", recursive(array[u][0],array[u][1])); 
     free(array[u]); 
    } 
    free(array); 

    return 0; 
} 

替代

的此代碼中的數組用法本身最終是毫無意義的。所有你似乎真的想要做的是:

  • 讀取的行數
  • 對於每一行
    • 讀值
    • 對於這兩個值,計算使用兩種不同的GCD機制。時間測量仍然可以完成,但要小心,以免涉及任何實際的io操作。
    • 報告這些計算的結果

除非這是對一些學術活動,我看不出有任何理由使用任何陣列,這在所有,減少main()成類似:

int main() 
{ 
    int row; 

    FILE *fp = fopen("data1.txt", "r"); 
    if (fp == NULL) 
    { 
     perror("data1.txt"); 
     return EXIT_FAILURE; 
    } 

    if (fscanf(fp, "%d", &row) == 1 && row > 0) 
    { 
     while (row--) 
     { 
      int a,b; 
      if (fscanf(fp, "%d %d", &a, &b) == 2) 
      { 
       printf("Iteration GCD(%d,%d) = %d\n", a,b,iteration(a,b)); 
       printf("Recursive GCD(%d,%d) = %d\n", a,b,recursive(a,b)); 
      } 
     } 
    } 
    fclose(fp); 

    return 0; 
} 

最終如何做到這一點取決於您,無論需求如何。但如果你沒有使它變得複雜,那麼不要。

+0

我明白我的代碼出了什麼問題!謝謝 – Lumby