Глобальная область видимости массива переменной длины - PullRequest
0 голосов
/ 10 июля 2011

возможно ли объявить массив переменной длины с глобальной областью действия в target-c?

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

после функции инициализации запланирован метод nextFrame: (я использую cocos2d и метод расписания CCDirector). Мне было интересно, как передать массив карты int [] [] [] из функции инициализации в функцию nextFrame

Я пытался использовать глобальное (статическое ключевое слово) объявление, но получил ошибку, сообщающую, что глобальные массивы не могут быть переменной длины

фактическая строка кода, на которую я ссылаюсь:

int map[xmax][ymax][3];

где xmax и ymax - самые дальние координаты x и y в списке координат, который определяет этап.

Я бы хотел как-то передать их в nextFrame:, что запланировано в

[self schedule:@selector(nextFrame:)];

Я понимаю, что могу использовать NSMutableArray, но NSMutableArray - своего рода головная боль для трехмерных списков целых чисел (я должен использовать числа-оболочки для всего ...) Есть ли способ сделать это с целочисленными массивами?

Ответы [ 2 ]

0 голосов
/ 10 июля 2011

Вы не можете иметь статически распределенный глобальный массив динамических измерений в C (из которых Objective C является чистым надмножеством).Но вы можете использовать глобальный массив любой длины или размера (вплоть до доступной памяти) во время выполнения, используя глобальную арифметику указателя, malloc и индексации массива.

static int *map = NULL;

...
map = malloc (dim1 * dim2 * dim3 * sizeof(int));  // in some initialization method

if (map == NULL) { /* handle error */ }    // before first array access

...
myElement = map[ index3 + dim2 * ( index2 + dim1 * index1 ) ];  // some macro might be suitable here

Или вы можете сделать Objective C getter иМетоды установки, которые проверяют массив и границы массива при каждом доступе, поскольку метод может возвращать простые типы данных C.

Другой вариант, если вы знаете максимальные измерения, которые вы хотите иметь в наличии и готовы использовать (тратить)) это количество памяти, просто статически распределять массив max и выдавать исключение, если программа пытается установить что-то большее, чем допустимый максимум.

0 голосов
/ 10 июля 2011

Я пытался использовать global (статическое ключевое слово) декларация, но есть сообщение об ошибке что глобальные массивы не могут быть переменными длина

Но указатели на глобальные массивы могут указывать на массивы переменной длины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...