2012-05-09 16 views
6

Tengo una matriz tridimensional gigante que representa mi mundo. Es demasiado grande para inicializar estáticamente:¿Cómo debo inicializar esta matriz multidimensional?

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

Error: index 128 overflow for static array 

He intentado utilizar World* world pero todavía errores con el desbordamiento anteriormente. Así que lo que tengo en este momento es este horrible desastre:

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

que funciona, pero me hace llorar un poco más en el interior. ¿Hay alguna forma de convertir el resultado de calloc en una matriz tridimensional? Lo hice cortando arreglos regulares, pero la cosa 3-D me está confundiendo.

+1

Esta es la pregunta 666º etiquetada con [d]. Hmm. – nmichaels

+0

Y es sobre mi tema D favorito, definición/inicialización de matrices multidimensionales. Todavía no entiendo la semántica. – sleeplessnerd

Respuesta

9

Si desea declarar una matriz dentada (es decir, donde cada subarreglo puede tener una longitud variable), entonces necesita usar un bucle como lo está haciendo, pero eso no es necesario para matrices uniformes. Esta es la forma de inicializar una matriz multidimensional que no es irregular:

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

Al poner los números entre corchetes, usted es que sea una matriz dinámica de las matrices estáticas. Así,

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

declara una matriz dinámica de un matrices estáticas de longitud 128 de las matrices estáticas de longitud 128. supongo que sería útil si realmente se necesita para hacer eso (que no tengo), pero definitivamente hace tropezar a los novatos regularmente.

En lo personal, para evitar este tipo de problemas por completo, yo nunca puse los números entre los paréntesis, incluso cuando se declara una matriz única dimensión:

auto arr = new Cell[](128); 

Me parece que el hecho de que poner el número entre los paréntesis en la primera dimensión se trata como una matriz dinámica, mientras que poner números en cualquier otro nivel se trata como una matriz estática para ser una opción de diseño deficiente, y no sé por qué es así, pero esa es la forma en que es . Puedo entender el deseo de poder crear matrices dinámicas de matrices estáticas, pero hubiera sido mucho más consistente desestimar new Cell[128] o hacer que devuelva un Cell[128]* en lugar de un Cell[] de longitud 128, pero desafortunadamente, así no es como funciona .

Cuestiones relacionadas