- 締切済み
C言語で行列の積を計算できるような関数を作って疑問に思ったことがありま
C言語で行列の積を計算できるような関数を作って疑問に思ったことがあります。 まず↓のような2x3行列と3x2行列が計算できる関数を作りました、、 #include <stdio.h> void mul(const int ma[2][3],const int mb[3][2],int mc[2][2]) { int i,j,k; for(i = 0; i < 2; i++) for(j = 0;j < 2;j++) for(k=0;k<3;k++) mc[i][j]+=ma[i][k]*mb[k][j]; } int main(void) { int i,j; int ma[2][3] ={{1,2,3},{4,5,6}}; int mb[3][2] ={{7,8},{9,0},{1,2}}; int mc[2][2] ={0}; mul(ma,mb,mc); for(i = 0;i < 2; i++) { for(j = 0;j < 2;j++) printf("%4d",mc[i][j]); putchar('\n'); } eturn(0); } ---------------------------------- これをmxn,nxp行列で計算できるような関数にしたいと思い 下のようにしたのですがエラーになります。どうしたらいいでしょうか・・? #include <stdio.h> void mul(const int ma[int m][int n],const int mb[int n][int p],int mc[m][p]) { int i,j,k; for(i=0;i<m;i++) for(j=0;j<p;j++) for(k=0;k<n;k++) mc[i][j]+=ma[i][k]*mb[k][j]; } int main(void) {int i,j; int ma[2][3] ={{1,2,3},{4,5,6}}; int mb[3][2] ={{7,8},{9,0},{1,2}}; int mc[2][2] ={0}; mul(ma,mb,mc); for(i = 0;i < 2; i++) {for(j = 0;j < 2;j++) printf("%4d",mc[i][j]); putchar('\n');} return(0);}
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
「今の C の規格に従っていれば動く」という意味において「環境による」といえます>#4.
- yuu_x
- ベストアンサー率52% (106/202)
「C言語 多次元配列 引数」 で検索してみてください。 結論から言うと、C 言語で多次元引数を引数指定する場合は、 void mul(const int ma[][3],const int mb[][2],int mc[][2]); のように、二次元目以降は定数を指定する必要があり変数では指定できません。 任意サイズを扱う場合は、 ・行、列数と共に、int ポインタとして渡す。 ・配列を十分なサイズで固定し、番兵を立てるなり、行、列数を持ちまわるなり、常に全て計算するなり。 ・専用の構造体を作る。 ・時間もしくは自信が無ければライブラリ くらいですかね。 >>3 は環境による?
- Tacosan
- ベストアンサー率23% (3656/15482)
しゃ~ないので void mul(int m, int n, int p, const int ma[m][n], const int mb[n][p], int mc[m][p]) あたりで.
- magicalpass
- ベストアンサー率58% (378/648)
> void mul(const int ma[int m][int n],const int mb[int n][int p],int mc[m][p]) メチャクチャです。こんなかたちで任意のサイズの配列が使えるなら誰も苦労はしません。
- asuncion
- ベストアンサー率33% (2127/6289)
何をしたとき(コンパイルですか?実行ですか?)に、 どんなエラー(エラーメッセージは?)が出るのですか? 具体的に示してください。