2011-07-10 61 views
0

是否可以在objective-c中聲明一個全局作用域的可變長度數組?objective-c可變長度數組全局作用域

我正在製作一個世界級的遊戲,它將世界地圖初始化爲一個三維整數數組。雖然它只是一個二維側滾動器,列表的第三個維度指出哪個區塊在前兩個維度所給出的座標下進行初始化函數後,方法nextFrame:調度(我正在使用cocos2d和CCDirector調度方法)。我想知道如何將int [] [] []地圖數組從初始化函數傳遞到nextFrame函數

我嘗試使用全局(靜態關鍵字)聲明,但得到一個錯誤,指出全局數組不能變長

的代碼,我指的是實際的路線是:

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

其中XMAX和YMAX是最遠的X和Y座標在定義階段的座標列表。

我想以某種方式將它們傳遞到nextFrame :,計劃於

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

我知道我可以使用的NSMutableArray,但NSMutableArray的是有點兒爲整數的3維列表頭痛(我有使用包裝數字的一切...)。有沒有辦法做到這一點與整數數組?

+2

我不是一個遊戲開發者,所以我可能不理解一些涉及的問題,但是你能不能創建一個使用NSMutableArray的WorldMap類,但只是用一個漂亮的API來抽象它的使用呢? –

+0

這是一個很好的觀點。我想我從來沒有真的想到這一點。 –

+0

是更好的是NSMutableArray的子​​類,或者只是有一個NSMutableArray作爲實例變量 –

回答

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 

或者你可以作出這樣的檢查在每次訪問數組和數組邊界,因爲一個方法可以返回普通的C數據類型目標C getter和setter方法。

另一種選擇是,如果你知道你想要的最大尺寸並且願意使用(浪費)該內存量,那麼就是靜態分配最大數組,並拋出一個異常,如果程序試圖設置大於你允許的最大值。

+0

如果我做了你指出的方法,我可能會做類似於myElement = map [index1] [index2] [index3]的東西,還是不行? –

+0

我的猜測是不會的,但我不確定多維數組是如何在內存中構造的 –

0

我嘗試使用全局(static關鍵字) 聲明,卻得到了一個錯誤說 全球陣列不能變 長度

但全局數組的指針可以指向可變長度的數組。