Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Tabla Mxn Dinámica...

Iniciado por Douch, 06 de Abril de 2005, 12:36:33 PM

« anterior - próximo »

Douch

 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!.

vincent

 
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!
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

sés

 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;
Soy indeciso... ¿o no?

CoLSoN2

 Exactamente como dice Vincent.

P.D: Por Dios, dejad de usar C y pasaros a C++ que estamos en el siglo veintiunoo!
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

Douch

 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!

samsaga2

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.

zupervaca

 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

CoLSoN2

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  
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

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.
Soy indeciso... ¿o no?

Capiflash

 Solo habia oido hablar una vez de D .

La ostia , vaya tabla comparativa , no podian haberle puesto mas capacidades al lenguaje  :P  

samsaga2

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++.

sés

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.
Soy indeciso... ¿o no?

CoLSoN2

 Lo único malo es que el compilador no está todo lo probado que cabría esperar :\
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

Vicente

 Hola,

pasate mejor a C# ;) Un saludo!

Vicente

zupervaca

 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






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.