• ベストアンサー

この問題教えて

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 どうしても分からないので誰か間違いがわかる人がいたら教えてください。

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

  • ベストアンサー
  • furlong
  • ベストアンサー率50% (17/34)
回答No.3

gccのバグではありません。重箱の隅を突くような話になりますが、ANSI準拠のコンパイラーは診断メッセージを出すのが正解です。 取り敢えず、ウォーニングを消したいだけなら、mainとwaでconstの有無を揃えれば良いです。 waのconstを外したくないなら、typedef を使って以下のようにしても良いです。 typedef int IntArray2 [2]; wa (const IntArray2 a[3], const IntArray2 b[3], IntArray2 c[3) 【ウォーニングが出る理由】 Cで関数に配列を渡すときはポインターに変換されることは御存知だと思います。 従って、wa (const int a[3][2], const int b[3][2], int c[3][2])は wa (const int (*a)[2], const int (*b)[2], int (*c)[2])と同じ意味です。 ここでaの型は「「「constのint」の配列」へのポインター」です。「「constの「intの配列」」へのポインター」ではありません。一方、main側のaの型は「「「int」の配列」へのポインター」です。 関数を呼ぶとき、「「xxx」へのポインター」を「「constのxxx」へのポインター」として渡すことは許されています。しかし、一般に「xxx」へのポインターを「yyy」へのポインターとして渡すことは許されています。たとえ、今回のように「xxx」が「「constのint」の配列」であり、「yyy」が「「int」の配列」であったとしてもです。 typedef int IntArray2 [2]; wa (const IntArray2 a[3], const IntArray2 b[3], IntArray2 c[3) この場合のaの型は「「constの「IntArray2」」へのポインター」、即ち「「constの「intの配列」」へのポインター」となり、「xxx」が「intの配列」ということでウォーニングが出なくなります。

kuritoguri
質問者

お礼

main関数とwa関数の順番を変えたらできました。 #include <stdio.h> int wa ( int a[][ ] ,int b[][] , int c[][] ); 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"); } } int wa ( int a[3][2] ,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]; } 大変、丁寧な説明を書いていただきどうもありがとうございました。

その他の回答 (2)

回答No.2

どうやらgccのバグのようです。 しかしエラーではなくて警告ですから、自分を信じて無視してください。

参考URL:
http://mail-index.netbsd.org/tech-toolchain/1999/04/11/0000.html
kuritoguri
質問者

お礼

おかげさまで自分の信じたらできました。 どうもありがとうございました。

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

こんばんは 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 このワーニングのメッセージの意味はわかりますか? kadai1.cの18行目でワーニングですね。 wa関数の第一(第二)パラメータに矛盾したポインタータイプを渡しているみたいですね。