Discussion:
Array dinámico de matrices
(demasiado antiguo para responder)
Prototipo
2003-11-01 19:38:58 UTC
Permalink
Hola. Necesito crear un vector dinámico de matrices (vamos, una matriz
tridimensional). El tamaño de las matrices lo conozco de antemano
(5x5), pero no sé cuántas voy a tener que guardar.

Había pensado en algo como

int *matriz[5][5];

Pero no tengo ni idea de cómo reservar memoria y cómo acceder después
elemento a elemento. ¿Puede por favor alguien decirme cómo hacerlo? Le
he dado vueltas y vueltas, al cerrar los ojos sólo veo punteros y
matrices.

saludos y gracias de antemano
Julián Albo
2003-11-01 20:05:15 UTC
Permalink
Post by Prototipo
Hola. Necesito crear un vector dinámico de matrices (vamos, una matriz
tridimensional). El tamaño de las matrices lo conozco de antemano
(5x5), pero no sé cuántas voy a tener que guardar.
Había pensado en algo como
int *matriz[5][5];
Pero no tengo ni idea de cómo reservar memoria y cómo acceder después
elemento a elemento. ¿Puede por favor alguien decirme cómo hacerlo? Le
he dado vueltas y vueltas, al cerrar los ojos sólo veo punteros y
matrices.
Lo mejor para no liarse es usar typedef.

typedef int mimatriz [5] [5];

mimatriz * matriz;

Y que quieres crear n de ellas, pues:

matriz= malloc (n * sizeof (mimatriz) );

Y para acceder, pues mimatriz [i] [j] [k], no hay mayor problema.

Salu2
Martin J. Sanchez
2003-11-01 20:40:06 UTC
Permalink
Post by Prototipo
Hola. Necesito crear un vector dinámico de matrices (vamos, una matriz
tridimensional). El tamaño de las matrices lo conozco de antemano
(5x5), pero no sé cuántas voy a tener que guardar.
Había pensado en algo como
int *matriz[5][5];
Pero no tengo ni idea de cómo reservar memoria y cómo acceder después
elemento a elemento. ¿Puede por favor alguien decirme cómo hacerlo? Le
he dado vueltas y vueltas, al cerrar los ojos sólo veo punteros y
matrices.
La declaracion:
int *matriz[5][5];
declara una matriz de 5*5 elementos, donde cada uno es un puntero a
int.

La declaracion correcta seria:
int (*matriz)[5][5];
lo que dice: matriz es una variable puntero a un array de 5*5
elementos donde cada uno es un int.

Para localizar memoria deberias hacer algo como:
matriz = malloc( n*sizeof(*matriz) );
donde n es el numero de matrices que deseas.

Para acceder al elemento [3][3] de la i-esima matriz, harias algo
como:
matriz[i][3][3]

De todas formas, en este tipo de situaciones donde el tipo y tamaño
del array de 5*5 no va a cambiar, es mas conveniente el uso de
typedef. Por ejemplo:
typedef int Tablero[5][5];
Tablero *tableros;
aqui decimos que Tablero es un tipo equivalente a un array de 5*5
ints, y tableros es una variable puntero a uno o varios Tablero.

Localizacion de n elementos:
tableros= malloc(n*sizeof(Tablero));

Pasar el Tablero i a una funcion:
iniciaTablero( tableros[i] );

Acceder al elemento [3][3] del Tablero i
tableros[i][3][3];


Un saludo,
Martin.
Martin J. Sanchez
2003-11-02 09:06:12 UTC
Permalink
On Sat, 01 Nov 2003 21:40:06 +0100, Martin J. Sanchez
Post by Martin J. Sanchez
iniciaTablero( tableros[i] );
Aqui se me ha colado un error. Ya que, con seguridad, la funcion
iniciaTablero esperaria la direccion de un Tablero a inicializar, la
llamada deberia ser:
iniciaTablero( &tableros[i] );
o lo que es lo mismo:
iniciaTablero( tableros+i );


Un saludo,
Martin.
Prototipo
2003-11-02 11:17:31 UTC
Permalink
Muchas gracias Julián y Martin por vuestras respuestas, sí que es
mucho más sencillo usando previamente typedef. Pero me queda otra
dudilla... Si en lugar de reservar espacio para X matrices de 5x5 de
una sola vez quiero hacerlo de una en una, ¿cómo sería?

Es decir, para reservar espacio para 8 "tableros", en lugar de hacer

tableros=malloc(8*sizeof(Tablero));

pues algo como

for (i=0;i<8;ii)
tableros[i]=malloc(sizeof(Tablero));

Esto en realidad ya no me importa tanto, pero siento curiosidad porque
esto último no me deja compilarlo.

saludos y gracias de nuevo
Julián Albo
2003-11-02 12:01:32 UTC
Permalink
Post by Prototipo
dudilla... Si en lugar de reservar espacio para X matrices de 5x5 de
una sola vez quiero hacerlo de una en una, ¿cómo sería?
Es decir, para reservar espacio para 8 "tableros", en lugar de hacer
tableros=malloc(8*sizeof(Tablero));
pues algo como
for (i=0;i<8;ii)
tableros[i]=malloc(sizeof(Tablero));
Esto en realidad ya no me importa tanto, pero siento curiosidad porque
esto último no me deja compilarlo.
No puedes hacer esto si tableros es un array de Tablero. Lo que
necesitas para hacer esto es un array de punteros a tablero, o un
puntero a puntero a tablero.

Tablero * tableros [8];

En el segundo:

Tablero * * tableros;

tableros= malloc (8 * sizeof (Tablero *) );

En el primer caso el número de tableros ha de ser fijo, en el segundo
puede ser variable.

Salu2

Loading...