Когда я пытаюсь объявить global
двумерный массив в C++
вот так:
int maxX = 10;
int maxZ = 10;
SDL_Rect mapX[maxX][maxZ];
Я получаю ошибку, которая говорит error: variable-size type declared outside of any function
(На первый взгляд это выглядело как «различие между вопросом 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
};
В 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
static const int maxX = 10;
static const int maxZ = 10;
SDL_Rect mapX[maxX][maxZ];
отлично работает для меня
Обычно не рекомендуется использовать глобальные, необработанные массивы или глобальные необработанные массивы в целом. Очевидно, у меня недостаточно контекста, чтобы прокомментировать, является ли это правильным выбором здесь.
До современного constness было обычно перечислять или #define
константы, чтобы заставить их работать правильно в этой ситуации.
Я не думаю, что это правильный способ использования SDL_rect.
Синтаксис должен быть как
SDL_Rect rect = {0,0,10,10}
Таким образом, вы можете сделать следующее;
int maxX = 10;
int maxZ = 10;
SDL_Rect rect = {0,0,maxX,maxZ}
Вместо массивов в стиле С я бы порекомендовал использовать std::vector
:
std::vector< std::vector<SDL_Rect> > mapX;