2

global次のように2次元配列を宣言しようとするとC++

int maxX = 10;
int maxZ = 10;
SDL_Rect mapX[maxX][maxZ];

エラーが発生します
error: variable-size type declared outside of any function

4

5 に答える 5

8

(一見すると、「CとC ++の質問の違い」のように見えましたが、誤解される可能性があります。)

配列サイズとして非定数値を使用したため、可変長配列(VLA)を宣言しようとしています。C ++はVLAをまったくサポートしていませんが、CはローカルVLAのみをサポートしています。後者は、まさにコンパイラがそのエラーメッセージであなたに言っていることです。(C ++コンパイラではまったく異なるエラーが発生するため、このエラーメッセージはCコンパイラからのものだと思います。)

したがって、厳密に言えば、CでもC++でもそのような配列を宣言することはできません。C言語はVLAをサポートしていますが、それでもローカルである必要があります。Cで静的ストレージ期間のVLAを宣言することは許可されていません。

C ++では、すべての配列のコンパイル時サイズが事前に決定されている必要があります。つまり、配列サイズはコンパイル時定数で指定する必要があります。代わりに非定数値を使用したため、エラーが発生しました。

つまり、CとC ++の両方で、静的ストレージ期間のある配列(いわゆる「グローバル」配列を含む)のサイズを指定するときに定数式を使用する必要があります。

C ++では、サイズを一定にするために、次のように宣言する必要があります。const

const int maxX = 10;
const int maxZ = 10;

Cでは、オブジェクトは定数式constを形成しないという意味で実際には定数ではないため、これは機能しません。Cでは、どちらかを使用する必要があります

#define maxX 10
#define maxZ 10

また

enum {
  maxX = 10,
  maxZ = 10
};
于 2012-12-25T19:38:57.650 に答える
2

C++ では、変数を使用して配列のサイズを定義することはできません。これは、配列のメモリを割り当てる場所と必要なメモリ量をコンパイラがコンパイル時に知る必要があるためです。maxXand maxZasを宣言intすると変数になるため、配列の次元には適していません。ただし、それらを として宣言するconst intと定数になり、コンパイラはこれらの値がプログラムの実行中に固定されることを認識し、それらを使用して配列の次元を定義できるようにします。

したがって、これは機能しません。

int maxX = 10;
int maxZ = 10;
SDL_Rect mapX[maxX][maxZ]; // Not allowed

しかし、これは問題ありません:

const int maxX = 10;
const int maxZ = 10;
SDL_Rect mapX[maxX][maxZ]; // Allowed
于 2012-12-25T19:28:48.550 に答える
1
static const int maxX = 10;
static const int maxZ = 10;
SDL_Rect mapX[maxX][maxZ];

私にとってはうまくいきます。


ノート

一般に、グローバル、生の配列、またはグローバルな生の配列のいずれかを使用することは、一般的には良い習慣ではありません。明らかに、ここでの選択が正しいかどうかについてコメントするのに十分なコンテキストがありません。


歴史的なメモ

現代の constness の前#defineは、この状況で正しく機能させるために、列挙または定数のいずれかを使用するのが一般的でした。

于 2012-12-25T19:18:33.607 に答える
0

これが SDL_rect の正しい使い方だとは思いません。

構文は次のようになります

SDL_Rect rect = {0,0,10,10}

したがって、次のことができます。

int maxX = 10;
int maxZ = 10;
SDL_Rect rect = {0,0,maxX,maxZ}
于 2012-12-25T19:18:21.760 に答える
0

C スタイルの配列ではなく、次の使用をお勧めしますstd::vector

std::vector< std::vector<SDL_Rect> > mapX;
于 2012-12-25T19:23:53.280 に答える