[C con Clase] otro error mysql

Steven Davidson steven en conclase.net
Mar Jun 26 19:03:50 CEST 2007


Hola Duna,

El pasado 2007-06-26 16:20:16, Duna escribió:

D> Hola Steven, yo sigo con problemas, te cuento...

[CORTE]

D> He hecho lo que me has dicho para ver dónde sale el error, y el error sale
D> en consulta1, que es nulo, pero en teoría no debería ser así? me refiero a
D> que cuando creo la estructura, no le doy valor, o esque me está apuntazndo
D> a una mala dirección? como me has dicho

Exacto. Al crear tu estructura, sólo se crea memoria para las variables 'texto' y 'next', las cuales son punteros. Si no das un valor explícitamente a estos campos, contendrán cualquier valor arbitrario e indeseado; por lo que llamamos "basura". Debes darles un valor válido. Por ejemplo,

consulta1->texto = (char *) malloc( 100 );
consulta1->next = 0;

D> Con respecto a strncpy (consulta1->titulo, row[k], lon);
D> Me da error, que no puede convertir un unsigned long en un unsigned int,
D> pero claro, lon tiene que ser así para que le pueda asignar
D> mysql_fetch_lengths()...

Acabo de ver que declaraste 'lon' como un puntero, por lo que la forma correcta sería,

strncpy( consulta1->titulo, row[k], (unsigned int)(*lon) );

No creo que tengas problemas al hacer un cásting a 'unsigned int'.

D> Te haré caso en lo que me digas, seguro que sabes muchiiiisimo más que yo,
D> era por simple curiosidad, que haya veces que funcione y otras que no.

Esto suele ser el primer síntoma de que el programa no esté manejando memoria correctamente.

D> Crees que se podría solucionar si en lugar de ser titulo un puntero de
D> caracteres, fuese una estructura de char definida, es decir, que en lugar
D> de ser:
D> struct final_l_titulo
D> {
D>         char* titulo;
D>         struct final_l_titulo * next;
D> };
D> fuera
D> struct final_l_titulo
D> {
D>         char  titulo [100];
D>         struct final_l_titulo * next;
D> };

Sí, con esto te quitarías problemas de memoria con 'titulo'. Sin embargo, ten presente que los campos de cada fila de MySQL a copiarse tienen que tener 99 caracteres y luego agregarle el carácter nulo al final, como máximo. En otras palabras, si existe un cadena mayor que 100 caracteres en una fila de la tabla MySQL, tendrás que cortarla para que quepa en tu array 'titulo'.


Espero que con todo esto puedas resolver el problema y terminar con el programa.

Steven


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