- ベストアンサー
この問題教えて
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 どうしても分からないので誰か間違いがわかる人がいたら教えてください。
- みんなの回答 (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の配列」ということでウォーニングが出なくなります。
その他の回答 (2)
- mulukhiyya
- ベストアンサー率54% (12/22)
どうやらgccのバグのようです。 しかしエラーではなくて警告ですから、自分を信じて無視してください。
お礼
おかげさまで自分の信じたらできました。 どうもありがとうございました。
- arukamun
- ベストアンサー率35% (842/2394)
こんばんは 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関数の第一(第二)パラメータに矛盾したポインタータイプを渡しているみたいですね。
お礼
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]; } 大変、丁寧な説明を書いていただきどうもありがとうございました。