プロが教えるわが家の防犯対策術!

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件)

そもそもCではファイルのトップレベルにforとか書けないから、質問のコードは色々と省略されている筈。

メイン関数もないし。

配列の宣言も見あたらないが、これでは書き忘れたのか、トンデもない宣言が省略されているのかも分からない。

全然質問に載せるべき情報足りて無いので、必要なコードを全部載せよう。
    • good
    • 0

> エラーで


> 配列または、ポインターでない変数に添字が使われました、
> 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;
  }
でよいのではありませんか?
    • good
    • 0

配列aの定義がないですし変数Sの初期値もないので、どれだけの要素数が必要かがわからずエラーになります。


下記の内容を1行目の後に入れましょう。

S=100;
int a[S][S][S];
    • good
    • 1

エラーメッセージによれば、"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からの回答です。
    • good
    • 1

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;
}
    • good
    • 1

aはどこで定義してんの


Sの値はどこで初期化してんの

あとどこでエラーかわからん場合は
ソースバックアップしたうえで後ろからガッツリ削除してみろ
たとえば今回だと一番中のループを削除してmakeは通るのか
→通るなら削除した部分がエラー、通らないなら他の部分がエラー
そうしてどこの部分がエラーかを調べるんだ
    • good
    • 1

a[i][j][z]が定義されていません。



Sは数字が0ですから値を定義されていません。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています