
c言語の質問です。
3次元の計算を行いたくて初期値を設定したら
エラーで配列または、ポインターでない変数に添字が使われました、pointer to object型が必要ですと出ました。何が原因なのでしょうか?
int S, i, j,z;
for (i = 0; i < S; i++) {
for (j = 0; j < S; j++) {
for(z = 0; z < S; z++) {
if (i == 0 || i == S - 1) {
a[i][j][z] = 300;
} else if (j == 0 || j == S - 1) {
a[i][j][z] = 300;
}
else if (z == 0 || z == S - 1) {
a[i][j][z]=300;
}
else {
a[i][j][z] = 0;
}
}
}
}
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
そもそもCではファイルのトップレベルにforとか書けないから、質問のコードは色々と省略されている筈。
メイン関数もないし。配列の宣言も見あたらないが、これでは書き忘れたのか、トンデもない宣言が省略されているのかも分からない。
全然質問に載せるべき情報足りて無いので、必要なコードを全部載せよう。
No.6
- 回答日時:
> エラーで
> 配列または、ポインターでない変数に添字が使われました、
> pointer to object型が必要ですと出ました。
> 何が原因なのでしょうか?
そのエラーの原因は、配列 a が宣言されていないことです。
質問のコードを含む関数より前の、関数外の場所に
#define S 10000
int a[S][S][S];
と書きましょう。
それにともない、質問のコードの
int S, i, j, z;
は
int i, j, z;
に修正します。
上記の 10000 は、あなたが設定したい配列のサイズに合わせて
変更してください。
あと、ループの回し方が奇妙ですね。
int i, j, b = 300;
for (i = 0; i < S; i++)
for (j = 0; j < S; j++) {
a[i][j][0] = b;
a[i][j][S-1] = b;
a[0][i][j] = b;
a[S-1][i][j] = b;
a[i][0][j] = b;
a[i][S-1][j] = b;
}
でよいのではありませんか?
No.5
- 回答日時:
配列aの定義がないですし変数Sの初期値もないので、どれだけの要素数が必要かがわからずエラーになります。
下記の内容を1行目の後に入れましょう。
S=100;
int a[S][S][S];
No.4
- 回答日時:
エラーメッセージによれば、"pointer to object型が必要です"ということは、多分aがポインタ型ではなく、ポインタ型に変更する必要があるということです。
3次元配列を宣言していると仮定しますが、その宣言がコードの中にないようです。配列aを宣言する際に、ポインタ型として宣言する必要があります。例えば、次のように宣言できます。
c
Copy code
int S = 10; // 適切なサイズに変更してください
int ***a;
// aのメモリ確保
a = (int ***)malloc(S * sizeof(int**));
for (i = 0; i < S; i++) {
a[i] = (int **)malloc(S * sizeof(int*));
for (j = 0; j < S; j++) {
a[i][j] = (int *)malloc(S * sizeof(int));
}
}
// 以降のコード
for (i = 0; i < S; i++) {
for (j = 0; j < S; j++) {
for(z = 0; z < S; z++) {
if (i == 0 || i == S - 1) {
a[i][j][z] = 300;
} else if (j == 0 || j == S - 1) {
a[i][j][z] = 300;
} else if (z == 0 || z == S - 1) {
a[i][j][z] = 300;
} else {
a[i][j][z] = 0;
}
}
}
}
// メモリ解放
for (i = 0; i < S; i++) {
for (j = 0; j < S; j++) {
free(a[i][j]);
}
free(a[i]);
}
free(a);
このコードでは、aをint型の3次元ポインタとして宣言し、動的にメモリを確保しています。そして、計算が終わったらメモリを解放しています。適切なサイズやメモリの解放方法は、実際のプログラムの要件に応じて調整してください。
以上 chatGPTからの回答です。
No.3
- 回答日時:
aの定義はどうなっていますか。
Sの値は、どうなってますか。
例えば、以下のソースは、エラーにならず、正常に完了します。
#include <stdio.h>
int main()
{
int S, i, j, z;
S=10;
int a[10][10][10];
for (i = 0; i < S; i++) {
for (j = 0; j < S; j++) {
for (z = 0; z < S; z++) {
if (i == 0 || i == S - 1) {
a[i][j][z] = 300;
} else if (j == 0 || j == S - 1) {
a[i][j][z] = 300;
} else if (z == 0 || z == S - 1) {
a[i][j][z] = 300;
} else {
a[i][j][z] = 0;
}
}
}
}
return 0;
}
No.2
- 回答日時:
aはどこで定義してんの
Sの値はどこで初期化してんの
あとどこでエラーかわからん場合は
ソースバックアップしたうえで後ろからガッツリ削除してみろ
たとえば今回だと一番中のループを削除してmakeは通るのか
→通るなら削除した部分がエラー、通らないなら他の部分がエラー
そうしてどこの部分がエラーかを調べるんだ
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
define で 配列
-
ループカウンタを使用せず、配...
-
c言語プログラミング 等差数列...
-
C言語 ファイルの指定された行...
-
C言語を使って、ファイルの読み...
-
エラーが出てしまいます
-
C#で配列が空かを判定するには?
-
配列を使わずに、変数名を動的...
-
C# DataGridView のヘッダーセ...
-
Integer変数をカラにしたいので...
-
Excelですべての組合せ(重複組...
-
ExcelVBAでのkernel32(64bit)
-
isalpha()関数について
-
Run-Time Check Failure #3とい...
-
allocってなんですか?
-
CStringからchar*への型変換に...
-
C言語 配列の長さの上限
-
「#undef」と「#define」の使い...
-
VBAのプログラムで、DIAG = 1# ...
-
C言語の配列のサイズ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
c言語
-
c言語プログラミング 等差数列...
-
define で 配列
-
配列の要素数に変数を入れたい...
-
C言語 ファイルの指定された行...
-
int i, int i[1];
-
C#で構造体の配列を持った構造...
-
C言語において、 配列要素をひ...
-
C言語から質問です。
-
C#でのフィボナッチ数列
-
c言語 構造体
-
MFC - ダイアログボックスのPic...
-
構造体のextern方法
-
fclose()でセグメンテーション違反
-
C言語の課題が出たのですが自力...
-
2番目の最大値を求める
-
MFCのCArrayを使った二次元配列
-
const で宣言してるのに、値が...
-
配列の不正アクセスについて
おすすめ情報