2012-05-09 98 views
6

我有一個巨大的三維數組,代表我的世界。它太大了靜態初始化:我應該如何初始化這個多維數組?

alias Cell[128][128][128] World; // <-- The compiler points to this line 

Error: index 128 overflow for static array 

我嘗試使用World* world但仍然出現了錯誤與上面的溢出。所以我現在有這個醜陋的混亂:

alias Cell[][][] World; 
// ... 
private World world; 
// ... 
world.length = WORLD_XDIM; 
for (uint x = 0; x < world.length; ++x) 
{ 
    world[x].length = WORLD_YDIM; 
    for (uint y = 0; y < world[x].length; ++y) 
    { 
     world[x][y].length = WORLD_ZDIM; 
    } 
} 

這樣的作品,但它讓我哭了一下在裏面。有沒有辦法將calloc的結果轉換爲三維數組?我已經完成了對常規數組的切片,但3D是讓我感到困惑的。

+1

這是第[66]個標記爲[d]的問題。嗯。 – nmichaels

+0

這是關於我最喜歡的D主題,多維數組的定義/初始化。我仍然沒有得到語義。 – sleeplessnerd

回答

9

如果你想聲明一個參差不齊的數組(即每個子數組可能有不同的長度),那麼你需要像使用循環一樣使用循環,但這對於統一數組是不必要的。這是你如何初始化一個多維數組這不是鋸齒狀:

auto arr = new Cell[][][](128, 128, 128); 

當你把括號內的數字,你正在做這靜態數組的動態數組。所以,

auto arr = new Cell[128][128][128]; 

聲明長度128的靜態數組的長度爲128的靜態數組的動態數組我想,如果你確實需要做的(這是我從來沒有),這將是有益的,但它肯定會定期去旅行新手。

就個人而言,爲了避免這樣的問題完全,我只是從來沒有把這些數字在括號之間,宣告一維數組,即使:

auto arr = new Cell[](128); 

我發現,把括號內的數字的事實第一個維被視爲一個動態數組,而把數字放在任何更深層次的數據被視爲一個靜態數組,這是一個糟糕的設計選擇,我不知道爲什麼它是這樣的,但這就是它的方式。我可以理解想要能夠創建靜態數組的動態數組,但是如果不允許new Cell[128]或使它返回Cell[128]*而不是長度爲128的Cell[]會更加一致,但不幸的是,這不是它的工作原理。