2012-05-09 17 views
6

Mam olbrzymią trójwymiarową tablicę, która reprezentuje mój świat. To jest zbyt duża, aby zainicjować statycznie:Jak zainicjować tę tablicę wielowymiarową?

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

Error: index 128 overflow for static array 

Próbowałem za pomocą World* world ale jeszcze błędy się z przelewem powyżej. Więc mam teraz ten paskudny bałagan:

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; 
    } 
} 

To działa, ale sprawia, że ​​trochę płaczę w środku. Czy istnieje sposób, aby rzucić wynik calloc do 3-wymiarowej tablicy? Zrobiłem to, przecinając regularne tablice, ale ta trójwymiarowa sprawa mnie przeraża.

+1

To jest 666. pytanie oznaczone jako [d]. Hmm. – nmichaels

+0

I to jest o moim ulubionym temacie D, definicji/inicjalizacji wielowymiarowych tablic. Nadal nie rozumiem semantyki. – sleeplessnerd

Odpowiedz

9

Jeśli chcesz zadeklarować poszarpaną tablicę (tj. Gdzie każda podelement może mieć różną długość), musisz użyć pętli podobnej do twojej, ale nie jest to konieczne w przypadku jednolitych tablic. W ten sposób można zainicjować tablicę wielowymiarową, która nie jest poszarpany:

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

Kiedy można umieścić numery w nawiasach, masz zrobić to dynamiczna tablica tablic statycznych. Więc

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

deklaruje dynamicznej tablicy statycznej tablic długości 128 statycznych tablic o długości 128. Myślę, że dobrze byłoby, jeśli rzeczywiście potrzebne, aby to zrobić (co nie mam), ale zdecydowanie regularnie wyprawia nowicjuszy.

Osobiście, aby uniknąć takich problemów całkowicie, po prostu nigdy nie umieścić numery w nawiasach, nawet podczas deklarowania pojedynczą tablicę Wymiary:

auto arr = new Cell[](128); 

uważam fakt, że wprowadzenie liczby w nawiasach na pierwszy wymiar jest traktowany jako tablica dynamiczna, a umieszczanie liczb na dalszych poziomach jest traktowane jako tablica statyczna, co jest złym wyborem projektu, i nie wiem, dlaczego tak jest, ale tak to wygląda . Rozumiem, że chciałbym móc tworzyć dynamiczne tablice tablic statycznych, ale byłoby to o wiele bardziej konsekwentne, aby albo nie zezwalać na new Cell[128], albo na zwracanie wartości Cell[128]*, zamiast na Cell[] o długości 128, ale niestety to nie działa .

Powiązane problemy