2012-05-09 5 views
6

У меня есть гигантский 3-мерный массив, который представляет мой мир. Это слишком большое, чтобы инициализировать статический:Как инициализировать этот многомерный массив?

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 в трехмерный массив? Я сделал это с нарезкой регулярных массивов, но трехмерная вещь меня пугает.

+1

Это 666-й вопрос с тегом [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]*, а не Cell[] длиной 128, но, к сожалению, это не так, как это работает ,

Смежные вопросы