C/Visual C - Dualidad puntero-array

 
Vista:

Dualidad puntero-array

Publicado por Googol (255 intervenciones) el 12/11/2003 14:21:32
Hola!

Hacía mucho que no escribía por aquí... :-)

A ver, tengo una duda un poco extraña.
Imaginaos que tengo un array estático de matrices bidimensionales:

float matrices[10][4][4];

Esto me declara 10 matrices de 4x4, todas seguidas en memoria, y yo puedo acceder mediante:

matrices[num_matriz][num_fila][num_columna] = 1;

Ahora resulta que quiero que ese array sea dinámico. Es decir no quiero que mi implementación tenga fijo el número de matrices (10 en el ejemplo), sino que quiero hacerlo con un puntero y pedir memoria. Pero quiero que esa memoria vaya toda seguida.

O sea quiero:

float [...]matrices[...];
Los [...] no sé cómo son (es lo que pregunto :-D). Quiero declarar un puntero a lo que será un array de matrices de 4x4.

Luego haría _un solo_ new:

matrices = new [...]float[...](10);

y accedería a las posiciones de la matriz igual que antes:

matrices[num_matriz][num_fila][num_columna] = 1;

Básicamente lo que quiero saber es si se puede (y cómo) hacer en sólo una declaración las dos siguientes:

typedef float tipoMatriz[4][4];

tipoMatriz* matrices;

y luego cómo sería el new que con las dos declaraciones es:

matrices = new tipoMatriz[10];

¡¡Gracias!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Dualidad puntero-array

Publicado por Ismael (230 intervenciones) el 12/11/2003 18:32:39
Mira en Arrays y Punteros de la dirección de arriba.
Esta en C
Saludos
Ismael
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dualidad puntero-array

Publicado por chuidiang (677 intervenciones) el 13/11/2003 09:28:18
Pues no encuentro la forma. He probado

float *matriz[4][4];

pero luego no me deja hacer

matriz = new float [n*4*4];

He probado a poner parentesis en la declaración por varias partes, he probado con c en vez de c++, he probado varias variantes de poner tipos del estilo

float *matriz[][] /* sin poner tamaños entre los corchetes*/

y nada, que no hay manera.

Si encuentras la forma cuéntamelo.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dualidad puntero-array

Publicado por Googol (255 intervenciones) el 13/11/2003 23:50:04
Creo que lo tengo...

Lo he probado (sólo) en Linux, con extensión .c y .cpp.

La declaración de la variable sería:

float (*matrices)[4][4];

con lo que declaras un puntero a una matriz de cuatro por cuatro.

Luego para pedir la memoria hay que hacer explicitas las dimensiones:

matriz = new float[n][4][4];

Supongo que hacer explícitas las dimensiones te evita pegarte con cast de tipos.

Luego puedes acceder correctamente con:

matriz[1][2][3] = 1;

He mirado el código en ensamblador que te genera, y parece que hace lo que se espera. Para la asignación anterior, accede a la pila para recuperar el valor del puntero, y luego le suma 108 (( 1 * 16 + 2 * 4 + 3) * 4)

En C no tengo el new, a si es que uso malloc. El problema es el cast de tipos de la asignación del puntero a lo que devuelve malloc. Realmente gcc me saca un warning, no me detiene la compilación, pero como no me gusta que mis programas estén sucios con warnings he buscado el cast correcto :-)

La forma más guarrera es hacer el cast en el lado izquierdo:

(void*) matrices = malloc(n*sizeof(float[4][4]));

Por cierto, una cosa curiosa es (al menos para gcc) que también valdría poner n dentro del sizeof:

(void*) matrices = malloc(sizeof(float[n][4][4]));

Hay que reconocer que poner el cast de tipos a la izquierda es francamente ruín. La alternativa es currarselo un poco más (... por prueba y error O:-)) y averiguar el cast del lado derecho:

matrices = (float(*)[4][4]) malloc(n * sizeof(float[4][4]));

Bueno... espero no haber liado mucho a los foreros.

En cualquier caso, ante esta notación tan austera, creo que, por claridad ... y caridad, en mi código dejaré el typedef ;-)

¡¡Gracias a ambos!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar