Можно ли объявить глобальный 2D-массив в C / C ++?

Когда я пытаюсь объявить global двумерный массив в C++ вот так:

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

Я получаю ошибку, которая говорит
error: variable-size type declared outside of any function

2

Решение

(На первый взгляд это выглядело как «различие между вопросом C и C ++». Хотя я могу ошибаться.)

Поскольку вы использовали непостоянные значения в качестве размеров массива, вы пытаетесь объявить массив переменной длины (VLA). C ++ вообще не поддерживает VLA, а C поддерживает только местный Влас. Последнее именно то, что компилятор говорит вам в этом сообщении об ошибке. (И я считаю, что это сообщение об ошибке пришло от компилятора C, поскольку компилятор C ++ выдаст вам совершенно другую ошибку.)

Так что, строго говоря, вы не можете объявить такой массив ни в C, ни в C ++. Хотя язык C поддерживает VLA, они все еще должны быть локальными. Вы не можете объявлять VLA со статической продолжительностью хранения в C.

В C ++ все массивы должны иметь фиксированный предопределенный размер во время компиляции. Это означает, что размеры массива должны быть определены константами времени компиляции. Вместо этого вы использовали непостоянные значения, что и привело к ошибке.

Другими словами, в C и C ++ вы должны использовать постоянная выражения при указании размеров для массивов со статической продолжительностью хранения (включая так называемые «глобальные» массивы).

В C ++, чтобы сделать ваши размеры постоянными, вы должны объявить их с const

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

В C это не будет работать, так как в C const объекты не являются на самом деле постоянными в том смысле, что они не образуют константные выражения. В C вы должны использовать либо

#define maxX 10
#define maxZ 10

или же

enum {
maxX = 10,
maxZ = 10
};
8

Другие решения

В C ++ вы не можете использовать переменную для определения размера массива, так как компилятору необходимо знать во время компиляции, где назначить память массива и сколько памяти ему нужно. декларирование maxX а также maxZ как 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
2

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

отлично работает для меня


Заметка

Обычно не рекомендуется использовать глобальные, необработанные массивы или глобальные необработанные массивы в целом. Очевидно, у меня недостаточно контекста, чтобы прокомментировать, является ли это правильным выбором здесь.


Историческая справка

До современного constness было обычно перечислять или #define константы, чтобы заставить их работать правильно в этой ситуации.

1

Я не думаю, что это правильный способ использования SDL_rect.

Синтаксис должен быть как

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

Таким образом, вы можете сделать следующее;

int maxX = 10;
int maxZ = 10;
SDL_Rect rect = {0,0,maxX,maxZ}
0

Вместо массивов в стиле С я бы порекомендовал использовать std::vector:

std::vector< std::vector<SDL_Rect> > mapX;
0
По вопросам рекламы [email protected]