こんにちは。
早速ですが質問させていただきます。
(このプログラムの概要は省略させていただきます。)
下記プログラムなのですが、
#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ランキング
-
別ファイルの構造体の値を読み...
-
バイナリファイルの内容を、そ...
-
ヒアドキュメントの中のfor文
-
複数行のデータのPOST処理に関して
-
配列同士の足し算のループ処理
-
PHP SimpleXml unsetについて
-
php Undefined variableエラー
-
配列をファイルに書き込む方法
-
スカラーのベクトル微分
-
PHPでの簡易ビンゴゲームでの疑...
-
PHPでテキストファイルの一部を...
-
PHPで連想配列のプルダウンメニ...
-
配列を分解したいのですが
-
C言語で全角文字の扱いについて
-
verilogで、配列の一部をタスク...
-
配列をループでたくさん宣言し...
-
配列を回すとき、最後の要素だ...
-
String だと「 ByRef引数の型が...
-
配列一致(要素順番は違うが内容...
-
phpで、連想配列を普通の配列に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別ファイルの構造体の値を読み...
-
CSVファイルの最終行のデー...
-
stdClass Objectを連想配列のよ...
-
複数行のデータのPOST処理に関して
-
ヒアドキュメントの中のfor文
-
Resource id #3 と表示されま...
-
エラーメッセージ(無効な間接...
-
自動で番号を振りたい
-
PHPでCSVの一部の行を編集したい
-
C言語でCSVファイルの行数を読...
-
バイナリファイルの内容を、そ...
-
CSVデータの行数カウントをした...
-
ログファイルの古い日付の行を...
-
While文を使って配列の中身を全...
-
csvの内容を行単位で削除したい
-
多次元配列の一次元目の最大値...
-
pythonのファイルの並びでの読...
-
配列同士の足し算のループ処理
-
【PHP】csvファイルへの書き出...
-
配列をファイルに書き込む方法
おすすめ情報