2014-09-30 69 views
0

我收到錯誤:在第13,20,25,31和36行中無效的操作數爲二進制*。我不確定如何處理動態內存分配到指向矩陣指針的指針。另外,如何使用這個指向指針的方式將整數存儲在矩陣中。另外,我認識到在指針方面有很多更簡單的方法來實現這一點,但是我不得不使用任何括號並將函數輸入提供給我。錯誤:無效的操作數爲二進制*指向矩陣的指針

void read_matrices(int **A, int **B, int **C, int *m, int *n, int *p, char *file) { 
    FILE *fp = fopen(file, "r"); 
    if (!fp) { 
     fprintf(stderr, "\n Error: file open failed for file '%s'\n\n", file); 
     exit(0); 
    } 

    /* read & output m, n, p */ 
    fscanf(fp, "%d\n%d\n%d\n", m, n, p); 
    printf("\n m: %d\n n: %d\n p: %d\n\n", *m, *n, *p); 

    /* allocate memory for A and set values to null */ 
    A = calloc(m * n, sizeof(int)); 

    /* read A */ 
    int i, j; 
    for (i = 0; i < *m; i++) { 
     fscanf(fp, "\n"); 
     for (j = 0; j < *n; j++) { 
      fscanf(fp, "%d", *(A + i * n + j)); 
     } 
    } 

    /* allocate memory for B and set values null */ 
    B = calloc(n * p, sizeof(int)); 

    /* read B */ 
    for (i = 0; i < *n; i++) { 
     fscanf(fp, "\n"); 
     for (j = 0; j < *p; j++) { 
      fscanf(fp, "%d", *(B + i * p + j)); 
     } 
    } 

    /* allocate memory for C and set values null */ 
    C = calloc(m * p, sizeof(int)); 

    /* close FP & free allocated memory */ 
    fclose(fp); 
} 

回答

0

這是一個有點難以明白你在該函數在做什麼,但似乎你只需要更好地瞭解指針在C.

對於此行:

A = calloc(m * n, sizeof(int)); 

什麼這是做的是它試圖乘以兩個指針,但我假設你想乘以他們指向的值,所以你需要前綴m和n用*來解除引用它們(並得到它們的值)。

對於賦值給A,你現在想要做的是給一個「指向指針的指針」分配一個指針,這是不可能的。你需要通過在前面添加一個*來獲得它所指向的指針,然後你也應該將calloc的結果轉換爲(int *)來匹配你正在分配的內容。

實施例:

*A = (int*)calloc(*m * *n, sizeof(int)); 

同樣的規則適用於在代碼中的其他錯誤。

+0

謝謝,我不明白當我想使用它們的值時,我不得不解除引用m,n和p。另外,添加一個指向A的引用可以將它轉換爲原始指針或原始值? – user3339703 2014-09-30 04:43:02

+0

當您解引用A時,您將獲取底層整數指針。這段代碼有點蹩腳,但如果你通過read_matrices(&A,....)調用這個函數(而A是一個int指針[int *]),那麼函數內的A將會修改A的值是一個指針),將外部A有效地設置爲您在函數中分配的矩陣。 – mukunda 2014-09-30 04:46:50

+0

對於'void *'指針,在C語言中不需要鑄造 – 2014-09-30 05:03:52

0

讓我們來看看你的第一個錯誤。涉及的變量被聲明爲int *m, int *n,所以指向int的指針。

在管線13:

A = calloc(m * n, sizeof(int)); 

的錯誤是由於m * n。你在說乘法指針m與指針n。這是沒有意義的。您可能的意思是將指向的值乘以那些指針:(*m) * (*n)。那些說實話,我不明白爲什麼你在第一個地方製作了mn指針。

而且,A被聲明爲指向指針的指針。這可能意味着你也想要*A

我建議你閱讀傳遞值與傳遞地址。

+0

m和n是指向它們的值返回到主函數的指針,因爲此函數從外部文件讀取它們的值。感謝我的建議,當它通過一個指針和何時取消引用時,我會在路過時迷失 – user3339703 2014-09-30 04:46:07