こんにちは。
早速ですが質問させていただきます。
(このプログラムの概要は省略させていただきます。)
下記プログラムなのですが、
#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)と表示されます。
いったい何が問題あるのかが分かりません。
一応、ネットで検索をしてはみましたがポインタがなんたらかんたらと言うようなサイトしか見つかりませんでした。
ちなみにコメントで囲ったプログラムも同じメッセージが表示されでしまいます。
どなたか分かりますでしょうかよろしくお願いします。
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() 関数を書き直してみてはどう。
・以上。
お礼の返事が遅くなってしまってすいませんでした。
>int i=0,j=0,count=0;は out()、ketugou() 関数のローカル変数として宣言して使うべきです。
ご指摘ありがとうございます。確かにオリジナル関数でグローバル変数を使うよりもローカル変数を使ったほうが混同せずにすみますよね。
>for() を使えば for( 初期化 ; 条件式 ; 増減式 ) と1行で分かりやすく記述できますよ。
早速書き直してみました!while文を使うとカッコの中に初期化文を書くことが出来ませんし、
最後にインクリメント(デクリメント)を記述しないといけないので
面倒でした。これでプログラムはスッキリしたような気がします。
ご回答ありがとうございました^^
No.1
- 回答日時:
>int joint_data[3][25];
joint_dataはint型の「2次元」配列ですね。
> joint_data[i1][j1][k1]=0; //このあたりでエラーメッセージが表示される
「3次元」配列でアクセスしようとしていますね。
i1が0のうちは問題ないかも知れませんが、i1が1以上になったらどこにアクセスしたらよいのでしょうか?
お礼の返事が遅くなってしまってすいませんでした。
このエラーが出たプログラムの部分は問題のヒントとして与えられた物をそのまま持ってきたのですが、
配列名など自分のプログラムと一緒にして、と言ったことは考えていたのですが、
3次元配列を2次元配列に代入しているということに気づいていませんでした。
同じようなプログラムを作るときはこのようなミスがないように気をつけたいと思います。
ご回答ありがとうございました^^
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
csvファイルを読み込み→上書き...
-
Noのデータ受け渡しで同じNoが...
-
phpを実行するとファイルダウン...
-
CSVデータの行数カウントをした...
-
PHPでの正規表現を使った文字列...
-
ヒアドキュメントの中のfor文
-
デザインとプログラムの分離
-
print "<td>{$data[$i][$j]}</t...
-
重複確認
-
総当り表
-
配列を比較して同じものがあっ...
-
pythonで辞書データへのアクセ...
-
PostgreSQLの配列項目のデータ...
-
Smartyでtplファイルから配列を...
-
2次元配列CSVのソート
-
順位を付ける時のスコアの重複...
-
for文、while文を使った、phpプ...
-
配列をループでたくさん宣言し...
-
日付から順にデータを並び替えたい
-
うまくいきません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Resource id #3 と表示されま...
-
別ファイルの構造体の値を読み...
-
stdClass Objectを連想配列のよ...
-
CSVデータの行数カウントをした...
-
ヒアドキュメントの中のfor文
-
複数行のデータのPOST処理に関して
-
While文を使って配列の中身を全...
-
C言語でCSVファイルの行数を読...
-
行数が30万件ほどあるCSVから、...
-
csvの内容を行単位で削除したい
-
バイナリファイルの内容を、そ...
-
CSVファイルの最終行のデー...
-
PHPで、CSVファイルを、指定し...
-
doxygenを使用する環境について
-
csvファイルを読み込み→上書き...
-
FortranのOPEN文
-
PHPでCSVの一部の行を編集したい
-
ラジオボタンのチェックの付け方。
-
Ethnaでのsection使用法
-
CSVデータを正規表現で抜き出せ...
おすすめ情報