行列の和のプログラミングのエラーの解決方法

このQ&Aのポイント
  • Cソースコードをコンパイルした際に、`mat_add'の引数のポインタ型が互換性がないために警告メッセージが表示されることがあります。
  • エラーメッセージに示されたエラーは、`mat_add'の引数のポインタ型が互換性がないことを意味しています。
  • エラーを解決するには、`mat_add'の引数のポインタ型を修正する必要があります。
回答を見る
  • ベストアンサー

行列の和のプログラミング

以下のをCソースを打ち込んでコンパイルすると、 warning: passing arg 1 of `mat_add' from incompatible pointer type warning: passing arg 2 of `mat_add' from incompatible pointer type となります。これは、どういうエラーでどう直せばいいのでしょうか? #include <stdio.h> void mat_add(const int ma[2][3], const int mb[2][3], int mc[2][3]) { int i, j; for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) mc[i][j] = ma[i][j] + mb[i][j]; } int main(void) { int i, j; int ma[2][3] = { {10, -5, 4}, {18, -2, -18} }; int mb[2][3] = { {23, 16, -9}, {-3, 20, 5} }; int mc[2][3] = { 0 }; mat_add(ma, mb, mc); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) printf("%3d", mc[i][j]); putchar('\n'); } return (0); }

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

呼び出し側(main関数)では、maとmbはconstではありませんね。 ところが、mat_add関数では、両者がconstであると言っています。 その違いによる警告です。

bomkura
質問者

お礼

回答ありがとうございます!! おかげで上手くいきました。

関連するQ&A

  • 多次元配列の受渡しでの警告

    多次元配列を関数に受け渡す際に、 警告: passing argument 1 of ‘mat_add’ from incompatible pointer type 警告: passing argument 2 of ‘mat_add’ from incompatible pointer type のような警告が出てきてしまいます。 プログラムは、明解C言語(柴田望洋著)で紹介されているサンプルプログラムなのですが(下に載せておきます)、どうしてこのような警告がでるのか分からず困っています。 多次元配列の渡し方になにか問題があるのでしょうか? #include <stdio.h> void mat_add(const int ma[][3], const int mb[][3], int mc[][3]) { int i,j; for(i=0; i<2; i++) for(j=0; j<3; j++) mc[i][j] = ma[i][j] + mb[i][j]; } int main(void) { int i,j; int ma[2][3] = {{9,2,-3},{4,5,1}}; int mb[2][3] = {{9,2,-3},{4,5,1}}; int mc[2][3] = {0}; mat_add(ma, mb, mc); for(i=0; i<2; i++){ for(j=0; j<3; j++) printf("%3d",mc[i][j]); putchar('\n'); } return(0); }

  • 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);}

  • この問題教えて

    main関数で2つの2次元配列を次の表で初期化して、wa関数の中で相対する項の和の 配列を作り、main関数に戻って表示する。       52,35      15,24       52,65      65,88       78,25      99,12 一応こんなふうに書きましたが #include <stdio.h> wa ( const int a[3][2],const int b[3][2],int c[3][2]) { int i,j; for(i=0;i<3;i++) for(j=0;j<2;j++) c[i][j]=a[i][j]+b[i][j]; } int main(void) { int a[3][2]={{52,35},{52,65},{78,25},}; int b[3][2]={{15,24},{65,88},{99,12},}; int c[3][2]={0}; int i, j; wa ( a, b, c); for(i=0;i<3;i++){ for(j=0;j<2;j++) printf("%3d",c[i][j]); printf("\n"); } } こんなエラーが出ました kadai1.c: In function `main': kadai1.c:18: warning: passing arg 1 of `wa' from incompatible pointer type kadai1.c:18: warning: passing arg 2 of `wa' from incompatible pointer type どうしても分からないので誰か間違いがわかる人がいたら教えてください。

  • 行列の積の求めかた

    行列の積を求めるプログラムを組んだのですがうまく表示されないです。 x=1,2,3  4,5,6 y=1,5  5,3  8,1 としの行列の積です。 #include <stdio.h> int main(void) { int i,j; int ma[2][3] = {{1,2,3},{4,5,6}}; int mb[3][2] = {{1,5},{5,3},{8,1}}; int mc[2][2] = {0}; for(i=0;i<2;i++) for(j=0;j<3;j++) mc[i][i] += ma[i][j]*mb[j][i]; mc[1-i][i] += ma[1-i][j]*mb[j][i]; for(i=0;i<2;i++){ for(j=0;j<2;j++) printf("%3d",mc[i][j]); putchar('\n'); } return(0); } 結果は↓のようになります。 38 0 0 41 まだプログラミングをはじめて日が浅いので基本てきなとこが抜けてる かもしれません。よろしくお願いします。

  • C言語 行列の和

    C言語 行列の和 ご覧いただき有難うございます。 久しぶりにC言語の復習をしようと簡単な行列の計算を書いてみたのですが、思うような結果になりませんでした。 昨日から考えていたのですが、どこに間違いがあるのか発見できませんでした。 アドバイス等宜しくお願いいたします。 >環境 OS:Windows XP(32bit),Windows 7(64bit) コンパイラ:Visual Studio C++ 2010 Express (付属のコマンドプロンプ使用) >期待する結果 7 5 7 9 6 8 >出力された結果 7 8 0 0 0 0 >ソースコード #include <stdio.h> int main(void){ int i,j, ma[2][3] = {(1,2,3),(4,5,6)}, mb[2][3] = {(6,3,4),(5,1,2)}, mc[2][3] = {0}; for(i=0;i<2;i++){ for(j=0;j<3;j++){ mc[i][j] = ma[i][j] + mb[i][j]; } } for(i=0;i<2;i++){ for(j=0;j<3;j++){ printf("%3d",mc[i][j]); } putchar('\n'); } return (0); }

  • c言語 行列の積に関して

    <問>  4行3列の行列aと3行4列の行列bの積を、4行4列の行列cに格納する関数を作成せよ。  void mat_mul(const int a[4][3], const int b[3][4], int c[4][4]) 入門レベルのスキルしかありません。 上手く行列の積のプログラムが組めません。 行列の積の計算結果が何も出てきません。 どの様にしたら良いかご指導の程、宜しくお願いします。 <プログラム>  void mat_mul(const int a[4][3], const int b[3][4], int c[4][4]) { int i, j, k; for (i = 0; i < 4; k++) { for (j = 0; j < 4; i++) for (k = 0; k < 3; j++) c[i][j] = c[i][j] + (a[i][k] * b[k][j]); } } void mat_print(const int m[4][4]) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) printf("%4d", m[i][j]); putchar('\n'); } } int main(void) { int i, j ,k; int tensu1[4][3]; int tensu2[3][4]; int seki[4][4]; for(i = 0; i < 4; i++) { for (j = 0; j < 3; j++) { scanf("%d", &tensu1[i][j]); } putchar('\n'); } for(i = 0; i < 3; i++) { for(j = 0; j < 4; j++){ scanf("%d", &tensu2[i][j]); } putchar('\n'); } putchar('\n'); mat_mul(tensu1, tensu2, seki); puts("行列の積"); mat_print(seki); return 0; }  

  • 2次元配列の基礎について

    とある問題で 下に示す行列x,yの積を求めるプログラムを作成せよ。 x=[123][456] y=[15] [53][81] 問題の意味が自分にはよくわからないのですが この場合 123*15;123*53;123*81 456*15;456*53;456*81 の解答を表示させればいいのでしょうか? 自分でやったら以下のようになりましたが、これだと456*53と123*15と0しか表示されません。どこをどう直せば宜しいでしょうか? ご教授お願いしますm(__)m #include <stdio.h> int main(void){ int ma[3][1] ={{123},{456}}; int mb[3][1] ={{15},{53},{81}}; int mc[3][1] ={0}; int i; int j; for(i=0;i <= 3;i++){ for(j=0;j <= 1;j++){ mc[i][j] =ma[i][j] * mb[i][j]; } } for(i=0;i <= 3;i++){ for(j=0;j <= 1;j++){ printf("%3d",mc[i][j]); putchar('\n'); } } return 0; }

  •  ポインタを使って関数の値のやり取り

    c言語の問題なのですが、2つの異なる1次元配列の積をseki関数を使って計算してもうひとつの配列に入れてmain関数で表示するのですが、うまく走りません原因がわかる人がいた教えてください。 作った実行文は、 #include<stdio.h> int seki(int *pa,int *pb,int *pc); main(){ int a[]={5,2,3,5,3,2,4,8,9,9,7},b[]={4,3,8,4,6,2,8,9,1,6,4},c[11]={0}; int i,*pa,*pb,*pc; pa=&a; pb=&b; pc=&c; seki(pa,pb,pc); for(i=0;i<11;i++) printf("%d,",*(pc+i)); } int seki(int *pa,int *pb,int *pc){ int j; for(j=0;j<11;j++) *(pc+j)=*(pa+j) * *(pb+j); } こんな表示が出てきます。 toi2.c: In function `main': toi2.c:7: warning: assignment from incompatible pointer type toi2.c:8: warning: assignment from incompatible pointer type toi2.c:9: warning: assignment from incompatible pointer type たぶんmain関数内で書いたseki関数の引数の型に問題があると思うのですが。

  • プログラミングに関する問題が解けません;;

    1 「ファイルの入出力」 以下のプログラムはdata.txtのデータを読み込み,画面に出力するものです. 下記のプログラムの######を埋めて完成させよ. #include <stdio.h> #include <stdlib.h> int main(void){     char dummy[128], filename[128];     FILE *fp;     char x;   sprintf(filename,"data.txt");     fp=fopen(filename, "r");     if(#####(1)####) {        printf("ファイル%s が見つかりません\n",filename);        return(-1);      } while(#########(2)############){ putchar(x); } fclose(fp); return(0); } 2 構造体を用いたプログラム 名前と点数用のメンバを持つ構造体dataを宣言しなさい。 また、名前と点数を表示する関数hyoujiを完成させよ。 #include <stdio.h> (1) void hyouji(###(2)###, int no); int main(void){ struct data member[3] = {{"伊藤", 71},{"小林", 81},{"山田", 67},}; hyouji(member, 3); } void hyouji(####(3)####, int no){ int i; for(i=0; i<no; i++){ printf("%s:%d\n", ###(4)###); mem++; } } 3 「2次元配列を使った行列の四則演算」 次のプログラムは、2次元配列の和を求め結果を表示するためのものである. 関数 mat_tasu()の中身を完成させよ. ただし関数 mat_tasu()は引数を持たない関数とします. #include<stdio.h> int ma[2][2]={{1,2}, {3,4}}; int mb[2][2]={{5,6}, {7,8}}; int mc[2][2]; void mat_tasu(void); int main(void) { int i,j; mat_tasu(); for (i=0; i<2; i++){ for (j=0; j<2; j++) printf("%3d", mc[i][j]); putchar('\n'); } return (0); } /* 行列の和の計算 */ void mat_tasu(void) {      (1) } 各問題の(1)や(2)みたいになってるところに当てはまるプログラミングを教えてください! 一問だけでもいいので分かる方いましたら、回答お願いいたします!

  • 行列の和、積、乗算について(C言語)

    まだC言語の勉強を始めて1か月の初心者なのですが、みなさんにお聞きしたいことがあります。 任意の行列に対して和、積、乗算の関数を作り出力するプログラムを 作りたいのですが、試しに和の関数を作ってビルトしてみたら、 31個もエラーが出て、困っています。 ↓参考書を見ながら、自分なりに考えたプログラムです。 #include <stdio.h> typedef struct matrix{ int m; int n; double data[100][100]; } MATRIX; int main(void) { MATRIX a; MATRIX b; a.m=2; a.n=3; a.data[100][100]={{1,2,1},{2,3,3}}; b.m=2; b.n=3; b.data[100][100]={{2,3,1},{1,2,1}}; kekka=add_mat(MATRIX a,MATRIX b); printf("和:%f,kekka.data); //行列和関数 MATRIX add_mat(MATRIX a,MATRIX b){ MATRIX sum; int i,j; sum.m=a.m; sum.n=a.n; sum.data[100][100]={{0,0,0}{0,0,0}}; for(i=0;i<sum.m;i++){ for(j=0;j<sum.n;j++){ sum.data=(a.data)+(b.data); return sum; } } } return 0; } おそらく相当ダメな感じなのでしょうが、エラー文を読んでも なかなか解決できません。 ちなみに、積の関数は mul_mat(MATRIX c,MATRIX a,MATRIX b){ int i,j,k; for(i = 0; i < a.m; i++){ for(j = 0; j < b.n; j++){ for(k = 0; k < a.n; k++){ C[i][j] = C[i][j] + A[i][k] * B[k][j]; } } } という風に考えました。みなさまのお力を借りたいです。 よろしくお願いします

専門家に質問してみよう