- ベストアンサー
エラーメッセージ(無効な間接参照)
こんにちは。 早速ですが質問させていただきます。 (このプログラムの概要は省略させていただきます。) 下記プログラムなのですが、 #include <stdio.h> int i=0,j=0,count=0; int data[3][25]={ +1,-1,-1,-1,+1, //N +1,+1,-1,-1,+1, +1,-1,+1,-1,+1, +1,-1,-1,+1,+1, +1,-1,-1,-1,+1, -1,-1,+1,-1,-1, //A -1,+1,-1,+1,-1, -1,+1,+1,+1,-1, +1,-1,-1,-1,+1, +1,-1,-1,-1,+1, +1,+1,+1,+1,+1, //J -1,-1,+1,-1,-1, +1,-1,+1,-1,-1, +1,-1,+1,-1,-1, -1,+1,+1,-1,-1 }; int joint_data[3][25]; void out(void); void ketugou(void); void out(){ while(i<3){ while(j<25){ if(data[i][j] > 0) printf("●"); else printf("○"); j++; if((count+1) % 5 == 0) printf("\n"); count++; } printf("\n\n"); j=0; i++; } } void ketugou(){ int i1,j1,k1; for(i1=0;i1<3;i1++){ //結合係数の初期化 for(j1=0;j1<25;j1++){ for(k1=0;k1<25;k1++) joint_data[i1][j1][k1]=0; //このあたりでエラーメッセージが表示される } } /* for(i1=0;i1<3;i1++){ //結合係数の計算 for(j1=0;j1<25;j1++){ for(k1=j1+1;k1<25;k1++){ joint_data[i1][j1][k1]+=data[i1][j1]*data[i1][k1]; joint_data[i1][k1][j1]=joint_data[i1][j1][k1]; printf("joint_data[%d][%d][%d]=%d\n",i1,j1,k1,joint_data[i1][k1][j1]); } } }*/ printf("結合係数の計算を終了しました。\n"); } main(){ out(); ketugou(); return 0; } このプログラムを実行すると エラー 無効な間接参照(関数ketugou)と表示されます。 いったい何が問題あるのかが分かりません。 一応、ネットで検索をしてはみましたがポインタがなんたらかんたらと言うようなサイトしか見つかりませんでした。 ちなみにコメントで囲ったプログラムも同じメッセージが表示されでしまいます。 どなたか分かりますでしょうかよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
★エラーがでて当然かと思います。 >int joint_data[3][25]; ↑ こう宣言されているのに ketugou() 関数内で >joint_data[i1][j1][k1]=0; //このあたりでエラーメッセージが表示される ↑ こう使っているからエラーが出て当然ですよ。 なぜ二次元配列を三次元配列として操作しているのですか? おかしいです。 >いったい何が問題あるのかが分かりません。 ↑ joint_data[3][25] を joint_data[3][25][25] と宣言すれば良いとは思います。 コンパイルも通るだろうし実行時もエラーはでないと思いますけど。 試して見て下さい。 その他: ・グローバル変数の >int i=0,j=0,count=0; は out()、ketugou() 関数のローカル変数として宣言して使うべきです。 その他 while() よりも for() を使えば for( 初期化 ; 条件式 ; 増減式 ) と 1行で分かりやすく記述できますよ。out() 関数を書き直してみてはどう。 ・以上。
その他の回答 (1)
- Wr5
- ベストアンサー率53% (2173/4061)
>int joint_data[3][25]; joint_dataはint型の「2次元」配列ですね。 > joint_data[i1][j1][k1]=0; //このあたりでエラーメッセージが表示される 「3次元」配列でアクセスしようとしていますね。 i1が0のうちは問題ないかも知れませんが、i1が1以上になったらどこにアクセスしたらよいのでしょうか?
お礼
お礼の返事が遅くなってしまってすいませんでした。 このエラーが出たプログラムの部分は問題のヒントとして与えられた物をそのまま持ってきたのですが、 配列名など自分のプログラムと一緒にして、と言ったことは考えていたのですが、 3次元配列を2次元配列に代入しているということに気づいていませんでした。 同じようなプログラムを作るときはこのようなミスがないように気をつけたいと思います。 ご回答ありがとうございました^^
お礼
お礼の返事が遅くなってしまってすいませんでした。 >int i=0,j=0,count=0;は out()、ketugou() 関数のローカル変数として宣言して使うべきです。 ご指摘ありがとうございます。確かにオリジナル関数でグローバル変数を使うよりもローカル変数を使ったほうが混同せずにすみますよね。 >for() を使えば for( 初期化 ; 条件式 ; 増減式 ) と1行で分かりやすく記述できますよ。 早速書き直してみました!while文を使うとカッコの中に初期化文を書くことが出来ませんし、 最後にインクリメント(デクリメント)を記述しないといけないので 面倒でした。これでプログラムはスッキリしたような気がします。 ご回答ありがとうございました^^