2016-02-03 20 views
2

我發現了三個錯誤:警告在矩陣乘法使用函數

  1. 分配時將指針整數,未作鑄造
  2. 從兼容的指針類型傳遞的read參數1
  3. 預期int * (*)[10]但參數是類型的int (*)[10][10]

下面是代碼:

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

void read(int *(arr[10][10]), int row, int col) { //Third error here 
    int i, j; 
    for (i = 0; i < row; i++) 
     for (j = 0; j < col; j++) 
      scanf("%d", &arr[i][j]); 
} 
void multiply(int arr1[10][10], int row1, int col1, 
       int arr2[10][10], int row2, int col2, 
       int *prod[10][10]) { //Third error here 
    int i, j, k, temp; 
    for (i = 0; i < row1; i++) 
     for (j = 0; j < col2; j++) { 
      temp = 0; 
      for (k = 0; k < col1; k++) 
       temp += arr1[i][k] * arr2[k][j]; 
      prod[i][j] = temp; //First error here 
     } 
} 
void display(int arr[10][10], int row, int col) { 
    int i, j; 
    for (i = 0; i < row; i++) { 
     for (j = 0; j <col; j++) 
      printf("%d\t",arr[i][j]); 
     printf("\n"); 
    } 
} 
int main() { 
    int a[10][10], b[10][10], c[10][10], m, n, p, q, i, j, k; 
    printf("Enter the order of matrix A:"); 
    scanf("%d %d", &m, &n); 
    printf("Enter the order of matrix B:"); 
    scanf("%d %d", &p, &q); 
    if (n != p) { 
     printf("Matrix multiplication is not possible."); 
     exit(0); 
    } 
    printf("Enter the elements of matrix A:\n"); 
    read(&a, m, n); //Second error here 
    printf("Enter the elements of matrix B:\n"); 
    read(&b, p, q); //Second error here 
    multiply(a, m, n, b, p, q, &c); 
    printf("Matrix A is:\n"); 
    display(a, m, n); 
    printf("Matrix B is:\n"); 
    display(b, p, q); 
    printf("Product matrix is:\n"); 
    display(c, m, q); 
    return 0; 
} 
+1

數組不是第一類對象,所以你不應該只是複製了'int'什麼工作,並把它轉變爲一個數組版本。這段代碼很FOOBAR,很難全面解釋。 – user3528438

+1

在問一個問題之前檢查重複http://stackoverflow.com/questions/14548753/passing-a-multidimensional-variable-length-array-to-a-function – tano

+0

@ user3528438:我不確定你的意思是* FOOBAR *,也許是FUBAR?但這會被恕我直言的誇大。類型是錯誤的,可以很容易地修復,其餘的很簡單。 – chqrlie

回答

1

函數參數的類型int *(arr[10][10])int arr[10][10]不一樣。更改原型是這樣的:

void read_matrix(int arr[10][10], int row, int col) 

,因爲它是用C庫來實現FILE*流接口POSIX的系統調用的名稱,你不應該命名功能read。將其重命名read_matrix並調用它是這樣的:

printf("Enter the elements of matrix A:\n"); 
read_matrix(a,m,n); //Second error here 
printf("Enter the elements of matrix B:\n"); 
read_matrix(b,p,q); //Second error here 

原型爲矩陣乘法應當類似地改變到:

void multiply(int arr1[10][10], int row1, int col1, 
       int arr2[10][10], int row2, int col2, 
       int prod[10][10]) 

混亂從陣列被傳遞給函數在C方式莖:它們作爲指針傳遞給它們的第一個元素。當在表達式中使用數組時,我們會自動將數組衰減爲,並將其作爲函數參數或返回值傳遞。 multiply應該被稱爲是這樣的:

multiply(a, m, n, b, p, q, c); 

請注意,您應該使用大括號{}你所有for循環,其體內有一個以上的線。對於readmultiply中的外環,您省略它們並不嚴格不正確,但容易出錯並且不推薦。

您還應該檢查scanf()的返回值並驗證矩陣尺寸。

這裏是一個改進版本:

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

int matrix_read(int arr[10][10], int row, int col) { 
    int i, j; 

    for (i = 0; i < row; i++) { 
     for (j = 0; j < col; j++) { 
      if (scanf("%d", &arr[i][j]) != 1) 
       return -1; 
     } 
    } 
    return 0; 
} 

int matrix_multiply(int arr1[10][10], int row1, int col1, 
        int arr2[10][10], int row2, int col2, 
        int prod[10][10]) { 
    int i, j, k, temp; 

    if (col1 != row2) 
     return -1; 

    for (i = 0; i < row1; i++) { 
     for (j = 0; j < col2; j++) { 
      temp = 0; 
      for (k = 0; k < col1; k++) { 
       temp += arr1[i][k] * arr2[k][j]; 
      } 
      prod[i][j] = temp; 
     } 
    } 
    return 0; 
} 

void matrix_display(int arr[10][10], int row, int col) { 
    int i, j; 

    for (i = 0; i < row; i++) { 
     for (j = 0; j <col; j++) { 
      printf("%d\t", arr[i][j]); 
     } 
     printf("\n"); 
    } 
} 

int main(void) { 
    int a[10][10], b[10][10], c[10][10], m = 0, n = 0, p = 0, q = 0; 

    printf("Enter the order of matrix A: "); 
    if (scanf("%d %d", &m, &n) != 2 || m < 1 || m > 10 || n < 1 || n > 10) { 
     printf("Invalid matrix size: %d x %d.\n", m, n); 
     exit(1); 
    } 
    printf("Enter the order of matrix B: "); 
    if (scanf("%d %d", &p, &q) != 2 || p < 1 || p > 10 || q < 1 || q > 10) { 
     printf("Invalid matrix size: %d x %d.\n", p, q); 
     exit(1); 
    } 
    if (n != p) { 
     printf("Matrix multiplication is not possible."); 
     exit(1); 
    } 
    printf("Enter the elements of matrix A:\n"); 
    if (matrix_read(a, m, n)) { 
     printf("Invalid matrix data.\n"); 
     exit(1); 
    } 
    printf("Enter the elements of matrix B:\n"); 
    if (matrix_read(b, p, q)) { 
     printf("Invalid matrix data.\n"); 
     exit(1); 
    } 
    if (matrix_multiply(a, m, n, b, p, q, c)) { 
     printf("Matrix multiplication error.\n"); 
     exit(1); 
    } 
    printf("Matrix A is:\n"); 
    matrix_display(a, m, n); 
    printf("Matrix B is:\n"); 
    matrix_display(b, p, q); 
    printf("Product matrix is:\n"); 
    matrix_display(c, m, q); 
    return 0; 
} 
+0

非常感謝!但是,你能告訴我如何改變我從main()傳遞的數組而不使用指針參數嗎? –

+0

@SubramanianSridharan:沒有簡單的方法來避免傳遞指針參數,也沒有用。將函數參數定義爲「int arr [10] [10]」實際上告訴編譯器該函數接收一個指向10個整數數組的數組的指針。它相當於'int arr [] [10]'。向函數傳遞一個符合大小的數組傳遞一個指向其第一個元素的指針。我發佈了完整版本的代碼,請查看。 – chqrlie

+0

哦,謝謝!我認爲傳遞數組類似於傳遞一個整數,其中對形式參數所做的更改不會反映到實際參數中。 –