• ベストアンサー

エラーメッセージ(無効な間接参照)

こんにちは。 早速ですが質問させていただきます。 (このプログラムの概要は省略させていただきます。) 下記プログラムなのですが、 #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)と表示されます。 いったい何が問題あるのかが分かりません。 一応、ネットで検索をしてはみましたがポインタがなんたらかんたらと言うようなサイトしか見つかりませんでした。 ちなみにコメントで囲ったプログラムも同じメッセージが表示されでしまいます。 どなたか分かりますでしょうかよろしくお願いします。

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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() 関数を書き直してみてはどう。 ・以上。

noname#39315
質問者

お礼

お礼の返事が遅くなってしまってすいませんでした。 >int i=0,j=0,count=0;は out()、ketugou() 関数のローカル変数として宣言して使うべきです。 ご指摘ありがとうございます。確かにオリジナル関数でグローバル変数を使うよりもローカル変数を使ったほうが混同せずにすみますよね。 >for() を使えば for( 初期化 ; 条件式 ; 増減式 ) と1行で分かりやすく記述できますよ。 早速書き直してみました!while文を使うとカッコの中に初期化文を書くことが出来ませんし、 最後にインクリメント(デクリメント)を記述しないといけないので 面倒でした。これでプログラムはスッキリしたような気がします。 ご回答ありがとうございました^^

その他の回答 (1)

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

>int joint_data[3][25]; joint_dataはint型の「2次元」配列ですね。 > joint_data[i1][j1][k1]=0; //このあたりでエラーメッセージが表示される 「3次元」配列でアクセスしようとしていますね。 i1が0のうちは問題ないかも知れませんが、i1が1以上になったらどこにアクセスしたらよいのでしょうか?

noname#39315
質問者

お礼

お礼の返事が遅くなってしまってすいませんでした。 このエラーが出たプログラムの部分は問題のヒントとして与えられた物をそのまま持ってきたのですが、 配列名など自分のプログラムと一緒にして、と言ったことは考えていたのですが、 3次元配列を2次元配列に代入しているということに気づいていませんでした。 同じようなプログラムを作るときはこのようなミスがないように気をつけたいと思います。 ご回答ありがとうございました^^

関連するQ&A

専門家に質問してみよう