[C con Clase] otro error mysql

Steven Davidson steven en conclase.net
Mie Jun 27 17:03:12 CEST 2007


Hola Duna,

El pasado 2007-06-27 13:49:02, Duna escribió:

D> Hola Steven.
D> Nada, sigue dándome error cuando intento asignar lo que sea a
D> consulta1->titulo, sigue apareciendo el mismo error.
D> Me gustaría mandar una foto, pero creo que no se permite desde aquí.
D> He terminado por probar con la estructura poniendo char titulo [100] y al
D> final ha funcionado.

Si te funciona bien con un array y no con un puntero, entonces esto confirmaría las sospechas que no creaste memoria dinámicamente para 'titulo', cuando era un puntero.

D> Como en la base de datos lo he definido como un varchar de 200, no tendré
D> problemas de que sobrepase los caracteres...

Yo me refería a la operación inversa, porque vas a copiar la cadena desde la base de datos (varchar) a la cadena 'titulo' de 100 caracteres cuya cantidad es fija. También ten presente que sólo usaríamos 99 caracteres como máximo porque el último serviría para guardar el carácter nulo.

D> Ahora tengo el mismo problema pero con un int en esta estructura:
D> struct dos_l
D> {
D> int cl;
D> char* titulo;
D> int ce;
D> struct dos_l *next
D> };
D> Lo que hago es después de asignarle memoria, hago:
D> consulta3->cl= atoi (row[k]);
D> Y el error me da al asignar el int, y ahí no le veo solución porque no
D> puedo cambiarlo...

Nuevamente, comprueba que los punteros que usas no sean nulos y que contengan direcciones de memoria a bloques previamente creados con 'malloc()'. Escribe lo siguiente:

if( NULL == consulta3 )
  fputs( "ERROR: consulta3 es nulo", stderr );
else if( NULL == row )
  fputs( "ERROR: row es nulo", stderr );
else if( NULL == row[k] )
  fputs( "ERROR: row[k] es nulo", stderr );
else
  consulta3->cl = atoi( row[k] );

D> El caso es que antes no me daba un error que ahora me da, y creo que es
D> porque no estoy liberando los punteros...¿podría ser?

Recuerda que sólo tienes que liberar los punteros que tú mismo creaste con 'malloc()' u otra función alternativa.

Aunque el hecho de no liberar la memoria dinámicamente, cuando deberías haberlo hecho, es un error, no debería darte un mensaje de error en tiempo de ejecución.

D> Me refiero a que estoy compilando y consulta1 lo uso en varias funciones.
D> ¿Creeis que podría ser por eso?...me va a dar algo.
D> Era con free (consulta1);, no?

Sí. Para liberar memoria dinámicamente, bajo C, usa 'free()'.

D> Lo he probado y me vuelve a dar el mismo error...
D> Alguna otra idea?

Creo que después de tantos cambios al código fuente, ya no podemos hablar del mismo programa. Sugiero enviarnos de nuevo el código fuente que has escrito con todas las rectificaciones que has hecho hasta ahora.


Espero que podamos solucionar el problema, antes de que "te dé algo".

Steven


Más información sobre la lista de distribución Cconclase