匿名使用者
匿名使用者 發問時間: 電腦與網際網路程式設計 · 2 0 年前

C的指標: 到底哪兒出了問題??

以下是程式碼

目標是要用指標的方式做出讓兩個矩陣相加的程式

--------------------------程式碼分隔線------------------------------

#include <stdio.h>

#include <stdlib.h>

void matrix_add(int,int,int *,int *,int *);

void matrix_print(int,int,int *);

int main(void)

{

int m,n,i,j;

puts("Enter the dimensions m and n for m*n matrices:");

scanf("%d %d",&m,&n);

int m1[m][n],m2[m][n],m3[m][n];

//input m1//

for (i=0;i<m;i )

{

for (j=0;j<n;j )

{

printf("m1[%d][%d]=",i,j);

scanf("%d",*(m1 i) j);

}

}

//input m2//

for (i=0;i<m;i )

{

for (j=0;j<n;j )

{

printf("m2[%d][%d]=",i,j);

scanf("%d",*(m2 i) j);

}

}

//add//

matrix_add(m,n,m1,m2,m3);

//print//

puts("\nMatrix M1:");

matrix_print(m,n,m1);

puts("\nMatrix M2:");

matrix_print(m,n,m2);

puts("\nMatrix M3:");

matrix_print(m,n,m3);

printf("\n");

system("PAUSE");

return 0;

}

void matrix_add(int m,int n,int *m1,int *m2,int *m3)

{

int i,j;

//calculation//

for (i=0;i<m;i )

{

for (j=0;j<n;j )

*(*(m3 i) j)=*(*(m1 i) j) *(*(m2 i) j);

}

return;

}

void matrix_print(int m,int n,int *ma)

{

int i,j;

for (i=0;i<m;i )

{

for (j=0;j<n;j )

printf("%d",*(*(ma i) j));

printf("\n");

}

return;

}

--------------------------程式碼分隔線------------------------------

我用DevC 4.9.9.1 編譯的時候

在 matrix_add(m,n,m1,m2,m3); 和 matrix_print(m,n,m1); 那幾行

都出現了"cannot convert `int (*)[((n - 1) 1)]' to `int*' for argument `3' to `void"

的錯誤訊息

請問到底是哪兒出了問題?

這個程式該如何修改?

4 個解答

評分
  • Mark
    Lv 5
    2 0 年前
    最佳解答

    因為m1, m2, m3是 int 二維陣列, 和int *是不一樣的

    如果它們是一維陣列, 用int *是正確的

    但如果是二維陣列, 就不是 int *

    必須使用一維陣列指標來表示二維陣列 => int (*)[n]

    因為二維陣列, 如果編譯器不曉得一維的大小時

    它沒辦法知道 m[1][0] 實際上應該是從頭算起的第幾個byte

    如果宣告 int (*m1)[n], 就是宣告m1是一個指標, 它指向一個一維陣列[n]

    m1+1一次就會跳過n個int, 指向下一個一維陣列

    *(m1+1)就是一個一維陣列, 相當於 int *

    (*(m1+1))[0] 就相當於 m1[1][0]

    所以m1你可以把它當做一般的二維陣列來用

    *m1 ------> m1[0][0], m1[0][1],........, m1[0][n-1] => *m1就相當於m1[0]是一維陣列

    *(m1+1)--> m1[1][0], m1[1][1],........, m1[1][n-1]

    所以你要把你的函式參數有關二維陣列的宣告改成陣列指標

    void matrix_add(int m,int n,int (*m1)[n],int (*m2)[n],int (*m3)[n]);

    void matrix_print(int m,int n,int (*m1)[n]);

    我有做過一個小實驗, 用以下的程式

    姑且不論這樣的寫法好不好, 但在Dev C/C++的確是可以動的

    int m[3][3] = {{0,1,2},{3,4,5},{6,7,8}};

    void mat_add(int m, int n, int (*mat)[n])

    {

    int i, j;

    for (i=0;i<m;i++)

    {

    for (j=0;j<n;j++)

    { mat[i][j]++; }

    }

    }

    int main()

    {

    int i, j;

    mat_add(3, 3,m);

    for (i=0;i<3;i++)

    {

    for (j=0;j<3;j++)

    { printf("%d ", m[i][j]); }

    printf("\n");

    }

    system("pause");

    return 0;

    }

    2005-12-26 13:54:28 補充:

    QOO.....我原本的想法是和你一樣的

    Dev C/C++在這方面似乎有做過修改

    int m1[m][n]這類的寫法是會過的

    2005-12-26 14:19:56 補充:

    兩位可能先以Dev C/C++試過再來下定論比較好

    基本上, 我是同意兩位的說法

    標準的C語法不應該這樣寫

    但現在學生常用Dev C/C++

    Dev C/C++的確是可以這樣寫的

    我猜是它的編譯器對這方面做過修改

    可能實際產生出來的程式碼是用動態配置來做

    我只能說這是個不好的修改

    會影響初學者的觀念

    2005-12-26 14:27:51 補充:

    請問何謂以靜態陣列使用?

  • 2 0 年前

    感謝大家熱心的幫忙

  • Lv 7
    2 0 年前

    我同意QOO的意見.改過了也無用

    請參考

    http://tw.knowledge.yahoo.com/question/?qid=120508...

    以你的程式而言應用動態陣列比較好.如不用動態陣列,那你要以一維陣列處裡.

    有問題請再問

    2005-12-26 14:15:55 補充:

    int m1[m][n]是可以, 但是

    void matrix_add(int m,int n,int (*m1)[n],int (*m2)[n],int (*m3)[n]);

    則不行.有錯請糾正.且在宣告時以動態陣列宣告,但在用時卻以靜態陣列使用.不太好.

    2005-12-26 16:01:03 補充:

    失敬,失敬.俺的程式裡用的是舊版的C語法.忘了用新的語法.(用*[n]而不是(*)[n])你對的,我錯了

  • SiYu
    Lv 5
    2 0 年前

    就算改成void matrix_add(int m,int n,int (*m1)[n],int (*m2)[n],int (*m3)[n]);

    也是沒用的

    因為. n 是不故定大小.

    外加函數宣告原形時. compiler 只會看他的型別. m,n 跟本是不存在的東西. 所以跟本不會過.

還有問題?馬上發問,尋求解答。