objective-c可变长度数组全局范围

时间:2011-07-10 00:03:40

标签: iphone objective-c variables scope global

是否可以在objective-c?

中声明一个具有全局范围的可变长度数组

我正在制作一个世界级的游戏,它将世界地图初始化为三维整数数组。虽然它只是一个二维侧卷轴,但是列表的第三个维度表明哪一块块位于前两个维度给出的坐标

在初始化函数之后,调度了一个方法nextFrame:我正在使用cocos2d和CCDirector调度方法。我想知道如何将int [] [] [] map数组从初始化函数传递给nextFrame函数

我尝试使用全局(静态关键字)声明,但得到一个错误,说全局数组不能是可变长度

我所指的实际代码行是:

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

其中xmax和ymax是定义舞台的坐标列表中最远的x和y坐标。

我想以某种方式将它们传递给nextFrame:,这是在

中安排的
[self schedule:@selector(nextFrame:)];

我意识到我可以使用NSMutableArray,但NSMutableArray对于三维整数列表来说有点令人头疼(我必须使用包装数字来处理所有内容......)。有没有办法用整数数组做这个?

2 个答案:

答案 0 :(得分:0)

  

我尝试使用global(static keyword)   声明,但说错了   全局数组不能变量   长度

但是全局数组指针可以指向可变长度的数组。

答案 1 :(得分:0)

您不能在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和setter方法检查每次访问时的数组和数组边界,因为方法可以返回纯C数据类型。

另一种选择,如果你知道你想要的最大尺寸并且愿意使用(浪费)那么多的内存,那就是静态分配max数组,如果程序试图设置则抛出异常大于你允许的最大值的东西