Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Douch en 06 de Abril de 2005, 12:36:33 PM

Título: Tabla Mxn Dinámica...
Publicado por: Douch en 06 de Abril de 2005, 12:36:33 PM
 Buenas, he estado mirando por el foro para ver si ya ha sido respondida alguna vez la siguiente pregunta que os quiero hacer, pero como no he encontrado nada aquí lo dejo. Lo que quiero saber es si la forma de liberar la memoria es la correcta, pues aunque no da ningún problema a la hora de complilar, hay una especie de mosca que no me deja tranquilo y que me inclina que por aquí hay algo podrido.

Veamos, quiero reservar memoria dinámicamente para generar una tabla de mxn elementos, para ello uso el siguiente código:
Citar
tValoresTablero **pcTablero;
int i=0;

...( aquí hay código)...

//Reservamos memoria para almacenar los valores del tablero.   
//Memoria para las columnas.

pcTablero=(tValoresTablero **)malloc(sizeof(tValoresTablero)*tTablero.nColumnas);
if(pcTablero==NULL) return -4;
   
//Memoria para las filas.
while(ipcTablero=(tValoresTablero *)malloc(sizeof(tValoresTablero)*tTablero.nFilas);
   if(pcTablero==NULL) return -4;
   i++;[/list]}
...( aquí hay código)...

/*Liberando memoria.
Aquí es donde me huele raro, porque si no pongo el NULL, me da error en cuanto llega aquí la ejecución. Además, creo que me falta por liberar lo que es la propia variable pcTablero.
Uso Visual C, y al depurarlo, si pongo a continuación del FOR la siguiente línea
    free(pcTablero);
me salta un mensaje de error.*/
for(i=0;i<=tTablero.nColumnas;i++){
    pcTablero
=NULL;
  free(pcTablero);[/list]}

En fín, a ver si podeis hecharme un cable, aunque sea diciendome que está correcto :).

Saludos!.
Título: Tabla Mxn Dinámica...
Publicado por: vincent en 06 de Abril de 2005, 12:43:59 PM
 
Citar
/*Liberando memoria.
Aquí es donde me huele raro, porque si no pongo el NULL, me da error en cuanto llega aquí la ejecución. Además, creo que me falta por liberar lo que es la propia variable pcTablero.
Uso Visual C, y al depurarlo, si pongo a continuación del FOR la siguiente línea
free(pcTablero);
me salta un mensaje de error.*/
for(i=0;i<=tTablero.nColumnas;i++){
pcTablero=NULL;
  free(pcTablero);
}

Yo lo haria así...


for(i=0;i<=tTablero.nColumnas;i++){
   free(pcTablero[i]);
   pcTablero[i]=NULL;
}
free(pcTablero);
pcTablero = NULL;


No lo he podido probar pq tengo prisa pero yo diria que es así.

Taluegorl!
Título: Tabla Mxn Dinámica...
Publicado por: sés en 06 de Abril de 2005, 12:46:16 PM
 Así a primera vista creo que el primer malloc debería ser:
pcTablero=(tValoresTablero **)malloc(sizeof(tValoresTablero *)*tTablero.nColumnas);

Si utilizas C++, deberías utilizar new, que para estas cosas viene mucho mejor:
pcTablero = new tValoresTablero[tTablero.nColumnas][tTablero.nFilas];
Todo en una sola línea de código.


Si es C, yo prefiero asignar memoria para un array de una dimensión y calcular yo las filas y columnas:
tValoresTablero *pcTablero = (tValoresTablero *)malloc( sizeof(tValoresTablero) * tTablero.nColumnas * tTablero.nFilas );

...

pcTablero[fila*tTablero.nColumnas + columna] = loquesea;
Título: Tabla Mxn Dinámica...
Publicado por: CoLSoN2 en 06 de Abril de 2005, 12:47:51 PM
 Exactamente como dice Vincent.

P.D: Por Dios, dejad de usar C y pasaros a C++ que estamos en el siglo veintiunoo!
Título: Tabla Mxn Dinámica...
Publicado por: Douch en 06 de Abril de 2005, 01:23:59 PM
 Muchas gracias a todos, ya está resuelto (ole).

El que tiene razón es Sés, faltaba el * justo detrás de tValoresTablero:
CitarpcTablero=(tValoresTablero **)malloc(sizeof(tValoresTablero *)*tTablero.nColumnas);

Vincent, tu código solucionaba el problema pero me seguía mosqueando los NULLs. Los tuyos los veía como código innecesario, pues una vez liberada la memoria ya no voy a usar esa variable, mientras que los míos creo que hacían una auténtica burrada, pues perdía la referencia a la dirección de la memoria y ésta ¡¡seguía!! reservada.

Lo que me mosquea otro poquito de mi código (gracias a la intervención de Vincent me he percatado) es que intenta liberar memoria que no le corresponde (vamos, creo que es así) y no salta ningún mensaje de advertencia:
Citarfor(i=0;i<=tTablero.nColumnas;i++){
    pcTablero
=NULL;
        free(pcTablero);[/list]}
Se trada del <= que hay en la comparación del FOR. Si yo reservo memoria de, por ejemplo 5 casillas, las posiciones en C irían desde el 0 a 4, y aquí estoy liberando memoria de la casilla número 5 y no hay errores de por medio. ¿És realmente un error o necesito comprarme unas gafas, tomarme una tila y revisar de nuevo el código para ver si el que falla soy yo?

CitarP.D: Por Dios, dejad de usar C y pasaros a C++ que estamos en el siglo veintiunoo!
Lo intento macho, pero estoy intentando alcanzar el nirvana de la programación con C puro y duro. Hasta que lo controle con 2 cojo**s voy a seguir con ello pero espero que pronto de el gran salto a C++.  (uoh)

Gracias por todo.

Bo!
Título: Tabla Mxn Dinámica...
Publicado por: samsaga2 en 06 de Abril de 2005, 02:26:08 PM
Cita de: "CoLSoN2"Exactamente como dice Vincent.

P.D: Por Dios, dejad de usar C y pasaros a C++ que estamos en el siglo veintiunoo!
¿C obsoleto? El C sigue siendo necesario hoy en dia. Programar por ejemplo el Kernel de Windows o Linux en C++ seria una bestialidad.
Título: Tabla Mxn Dinámica...
Publicado por: zupervaca en 06 de Abril de 2005, 03:20:19 PM
 el c es como el paint de windows, para recortar imagenes es el mejor jeje, hay cosas en las que c no ha sido superado y la mejor es que el codigo que haces es lo que se compila, nunca te agrega funcionalidades extras solo por el lenguaje, ya dije en un post que el c siempre tendra un lugar en mi corazon  :lol:, no obstante el c ya es menos usado y el c++ por fin esta cogiendo los adeptos que se merece, pero ojala que hagan un lenguaje universal y nos dejen de marear entre tantos
Título: Tabla Mxn Dinámica...
Publicado por: CoLSoN2 en 06 de Abril de 2005, 03:31:40 PM
Cita de: "samsaga2"¿C obsoleto? El C sigue siendo necesario hoy en dia. Programar por ejemplo el Kernel de Windows o Linux en C++ seria una bestialidad.
Pero este es un foro de programación de juegos, no de kernels de SO  :P  
Título: Tabla Mxn Dinámica...
Publicado por: sés en 06 de Abril de 2005, 03:34:55 PM
Cita de: "zupervaca"ojala que hagan un lenguaje universal y nos dejen de marear entre tantos
Yo pienso ponerme a probar cosas en D en cuanto tenga un ratito.
Título: Tabla Mxn Dinámica...
Publicado por: Capiflash en 06 de Abril de 2005, 04:47:10 PM
 Solo habia oido hablar una vez de D .

La ostia , vaya tabla comparativa , no podian haberle puesto mas capacidades al lenguaje  :P  
Título: Tabla Mxn Dinámica...
Publicado por: samsaga2 en 06 de Abril de 2005, 04:59:21 PM
Cita de: "sés"
Cita de: "zupervaca"ojala que hagan un lenguaje universal y nos dejen de marear entre tantos
Yo pienso ponerme a probar cosas en D en cuanto tenga un ratito.
Mi opinion personal es que el futuro esta en los lenguajes funcionales como Haskell o OCaml.

Al igual que D hay tropecientos lenguajes diferentes que no son mas que una extension al C/C++.
Título: Tabla Mxn Dinámica...
Publicado por: sés en 06 de Abril de 2005, 05:07:04 PM
Cita de: "samsaga2"Al igual que D hay tropecientos lenguajes diferentes que no son mas que una extension al C/C++.
No conozco muchos pero vamos... lo que he visto de D es impresionante.
No le he visto nada malo, por eso quiero probarlo. Como tengo todo lo que dicen y además sea rápido... en fin.
Título: Tabla Mxn Dinámica...
Publicado por: CoLSoN2 en 06 de Abril de 2005, 05:39:07 PM
 Lo único malo es que el compilador no está todo lo probado que cabría esperar :\
Título: Tabla Mxn Dinámica...
Publicado por: Vicente en 06 de Abril de 2005, 11:03:54 PM
 Hola,

pasate mejor a C# ;) Un saludo!

Vicente
Título: Tabla Mxn Dinámica...
Publicado por: zupervaca en 07 de Abril de 2005, 10:45:18 AM
 pues precisamente el D tiene muchas funcionalidades extra que agregan codigo oculto a tu aplicacion, cosa que a mi no me gusta  <_<

basicamente lo que he visto es una expansion del c++, si hicieramos un precompilador de c++ se podria hacer el lenguaje D facilmente, recuerden que basicamente solo cambia sintaxis y agregan cosas como un recolector de basura, etc

saludos