Cuando se declara una matriz de esta manera:declarar una matriz en C sin dar tamaño
int array[][] = {
{1,2,3},
{4,5,6}};
me sale un error que dice: "tipo matriz tiene incompleta tipo de elemento"
¿Qué está pasando ??
Cuando se declara una matriz de esta manera:declarar una matriz en C sin dar tamaño
int array[][] = {
{1,2,3},
{4,5,6}};
me sale un error que dice: "tipo matriz tiene incompleta tipo de elemento"
¿Qué está pasando ??
Con una matriz N-dimensional (N> 0), es necesario definir los tamaños de N-1 dimensiones; solo se puede dejar una dimensión para que el compilador la determine, y debe ser la primera dimensión.
Se puede escribir:
int d1[] = { ... };
int d2[][2] = { ... };
int d3[][2][3] = { ... };
Etc.
Tiene que indicar al menos todas las dimensiones excepto la más grande.
es decir, en su caso
int array[][3] = {
{1,2,3},
{4,5,6}};
no completamente cierto, necesitas especificar todo excepto el más externo, ¿verdad? – falstro
Correcto necesita las n-1 dimensiones más pequeñas. –
Es necesario especificar todas las dimensiones excepto en la mayor. La razón es que el compilador va a asignar un gran bloque de memoria, en oposición a una matriz de punteros que apuntan a sus propias pequeñas matrices. En otras palabras,
int array[][3][4] = ...;
destinará una región contigua de memoria del tamaño 3 * 4 * (sin embargo muchas matrices de 3x4 se declara aquí). Así, cuando más adelante en su código, se escribe
array[1][2][3] = 69;
con el fin de encontrar donde en la memoria para escribir 69, que comienza en la dirección (matriz), y luego salta hacia adelante 12 * sizeof (int) para llegar a la matriz [ 1], más 2 * 4 * sizeof (int) para llegar a la matriz [1] [2], más 3 * sizeof (int) para finalmente llegar al inicio de la matriz [1] [2] [3]. Compare esto con la escritura, por ejemplo,
int ***array = new int**[n];
for(i=0; i<n; i++)
{
array[i] = new int * [3];
for(j=0; j<4; j++)
array[i][j] = new int[4];
}
(lo siento si mi sintaxis no es exacta ... Ha pasado un tiempo desde que he tenido que codificar algo como esto en C). En este ejemplo, la matriz apunta a un bloque de código n * sizeof (int **) bytes de longitud. Cada elemento de este conjunto apunta a otra matriz de tamaño 3 * sizeof (int *) bytes de longitud. Cada elemento de estas matrices apunta a otra matriz de tamaño 4 * sizeof (int) bytes de longitud. En este caso, en lugar de calcular que la matriz [1] [2] [3] está en la dirección (matriz + algo), tendría que seguir algunos punteros diferentes en la memoria antes de encontrar dónde escribir 69.
Lamento ser el desafortunado upvote número 13, pero me pareció tremendamente útil :) –