Open juanhumphreys opened 3 weeks ago
No estoy con la compu a mano para correrlo, pero veo dos cosas:
MAXVERSES
, ya que eso te evita usar memoria dinámica para el array de versos y simplifica el ejercicio Quizás por esto te esté dando seg fault, si me incluis el mensaje de error completo lo miro, si no en un rato corro el código.
Saludos Juani!
Otra cosita que veo es las líneas:
aux->books[i] = NULL;
aux->books[i]->dim =0;
cuando hagas books[i]->dim estas desreferenciando NULL (ya que dijiste que books[i] es NULL en la línea anterior)
Una pregunta el alloc del vector de verse cuando lo deberia hacer, yo pense que lo estaba haciendo cuando hacia el addverse, otra cosa tenes razon con lo del books[i] apuntando al null, me parece que cuando hago el addverse lo estoy desreferenciando denuevo y que de ahi sale el seg fault. por lo tanto estaria bien hecha la funcion newbible entonces (obviamente sacando lo de dim) y acmbio el adverse? o cambio el newbible para que funcione correctamente el resto.
En newBible
estas haciendo calloc
entonces no hace falta que inicialices las cosas en cero (viene gratis con el calloc), ya que los libros son elementos estáticos de bibleCDT, y no punteros a zonas dinámicas sin inicializar.
Te agrego unos comentarios a la función addVerse que capaz así se entiende mejor:
int addVerse(bibleADT bible, size_t bookNbr, size_t verseNbr, const char * verse){
// esto esta bien salvo por MAX_VERSES
if(bible != NULL || bookNbr > DIMbooks ||verseNbr > MAX_VERSES || bible->books[bookNbr-1]->versiculos[verseNbr-1] != NULL){
return 0;
}
// aca estas preguntando si el versículo a agregar es mayor que la cantidad de espacio que tener para guardar los versículos (dim) 👍
// pero lo que deberías hacer es alocar mas memoria para poder guardar una cantidad mayor de versiculos
// si bible->books[bookNbr-1]->versiculos es el puntero a versiculos y no tiene suficiente espacio, deberías realocarlo (y modificar dim)
if(verseNbr > bible->books[bookNbr-1]->dim){
// acá estas haciendo un malloc pero después pisas ese valor en la siguiente linea (memory leak)
bible->books[bookNbr-1]->versiculos[verseNbr-1] = malloc(1 * sizeof(tverses));
bible->books[bookNbr-1]->versiculos[verseNbr-1] = cpyverse(verse);
return 1;
}
// nota: cpyverse esta mal, debería realocar a medida que necesita espacio, no hacer varios malloc
bible->books[bookNbr-1]->versiculos[verseNbr-1] = cpyverse(verse);
// si ya tenias espacio suficiente para guardarlo entonces la dimension del vector no cambia
bible->books[bookNbr-1]->dim++;
return 1;
}
ahi me salio muchas gracias!!!!!!!
Hola me tira segmentation fault y no entiendo por que .