Program received signal SIGSEGV, Segmentation fault.
0x00000000004011ee in cargar_participantes (ruta_archivo=0x402386 "campeonato.xml") at archivos.c:169
169 lista_categorias->siguiente= lista_categorias;
No entiendo por que me da un error de fragmentacion.
Os dejo el codigo de la funcion donde da el error:
- Código: Seleccionar todo
- int cargar_participantes(char *ruta_archivo){
 enum estado {espera, fin_campeonato, leyendo_campeonato, leyendo_participante, leyendo_categoria} estado=espera;
 register int r=0, f1=0, f2=0;
 char cl[101];
 participante *participantes, *p_temporal;
 categoria *categorias, *c_temporal, *c_auxiliar;
 if(ruta_archivo != NULL){
 FILE *archivo;
 archivo= fopen(ruta_archivo, "r");
 if(archivo != NULL){
 while(fscanf(archivo, "%s", &cl[0]) != EOF){
 if(strcmp(&cl[0], "<championship>") == 0){
 if(estado == espera){
 estado= leyendo_campeonato;
 }else{
 r=3;
 break;
 }
 }else if(strcmp(&cl[0], "<title>") == 0){
 while(strcmp(&cl[0], "</title>") != 0 && fscanf(archivo, "%s", &cl[0]) != EOF){
 if(strcmp(&cl[0], "</title>") == 0){
 f1=0;
 break;
 }else{
 switch(estado){
 case leyendo_campeonato: if(f1 == 0){
 strcpy(&titulo_campeonato[0], &cl[0]);
- Código: Seleccionar todo
- f1=1;
 }else{
 if((strlen(&titulo_campeonato[0]) + strlen(&cl[0])) < 100){
 strcat(&titulo_campeonato[0], " ");
 strcat(&titulo_campeonato[0], &cl[0]);
 }
 }
 break;
 case leyendo_categoria: c_temporal= &(p_temporal->categorias[f2]);
 if(f1 == 0){
 /*incorporando la categoria a las categorias en las que participa el participante*/
 strcpy(&c_temporal->nombre[0], &cl[0]);
 f1=1;
 }else{
 if((strlen(&c_temporal->nombre[0]) + strlen(&cl[0])) < 100){
 strcat(&c_temporal->nombre[0], " ");
- Código: Seleccionar todo
- strcat(&c_temporal->nombre[0], &cl[0]);
 }
 }
 break;
 case leyendo_participante: break;
 default: break;
 }
 }
 }
 }else if(strcmp(&cl[0], "<participant>") == 0){
 if(estado == leyendo_campeonato){
 /*reservando memoria para el nuevo participante*/
 p_temporal=(participante *) malloc(sizeof(participante));
 estado= leyendo_participante;
 f2=0;
 }else{
 r=3;
 break;
 }
 }else if(strcmp(&cl[0], "<name>") == 0){
 while(strcmp(&cl[0], "</name>") != 0 && fscanf(archivo, "%s", &cl[0]) != EOF){
 if(strcmp(&cl[0], "</name>") == 0){
 f1=0;
 break;
- Código: Seleccionar todo
- }else{
 switch(estado){
 case leyendo_participante: if(f1 == 0){
 /*copiando la cadena en su correspondiente lugar en la estructura del nuevo participante*/
 strcpy(&p_temporal->nombre[0], &cl[0]);
 f1=1;
 }else{
 /*concatenando la cadena del nombre que falta al nombre dejando un espacio por medio si hay espacio en la cadena de la estructura*/
 if((strlen(&p_temporal->nombre[0]) + strlen(&cl[0])) < 100){
 strcat(&p_temporal->nombre[0], " ");
 strcat(&p_temporal->nombre[0], &cl[0]);
 }
 }
 break;
 default: break;
 }
 }
 }
 }else if(strcmp(&cl[0], "</participant>") == 0){
 if(estado == leyendo_participante){
 /*copiando la categoria*/
- Código: Seleccionar todo
- c_auxiliar= (categoria *) malloc(sizeof(categoria));
 strcpy(&c_auxiliar->nombre[0], &c_temporal->nombre[0]);
 c_temporal= c_auxiliar;
 /*añadiendo el nuevo participante a la lista de participantes*/
 if(participantes == NULL){
 participantes= p_temporal;
 participantes->siguiente= participantes;
 participantes->anterior= participantes;
 }else{
 p_temporal->siguiente= participantes->siguiente;
 p_temporal->anterior= participantes;
 participantes->siguiente->anterior= p_temporal;
- Código: Seleccionar todo
- participantes->siguiente= p_temporal;
 participantes= participantes->siguiente;
 }
 estado= leyendo_campeonato;
 }else{
 r=3;
 break;
 }
 }else if(strcmp(&cl[0], "<result>") == 0){
 if(estado == leyendo_categoria){
 c_temporal= &(p_temporal->categorias[f2]);
 fscanf(archivo, "%f", &(c_temporal->puntuacion));
 }else{
 r=3;
 break;
 }
- Código: Seleccionar todo
- }else if(strcmp(&cl[0], "</result>") == 0){
 if(estado == leyendo_categoria){
 estado= leyendo_categoria;
 }else{
 r=3;
 break;
 }
 }else if(strcmp(&cl[0], "<category>") == 0){
 if(estado == leyendo_participante){
 estado= leyendo_categoria;
 }else{
 r=3;
 break;
 }
- Código: Seleccionar todo
- }else if(strcmp(&cl[0], "</category>") == 0){
 if(estado == leyendo_categoria){
 /*actualizando la lista de categorias en la variable global*/
 if(lista_categorias == NULL){
 categorias->siguiente= categorias;
 categorias->anterior= categorias;
 }
 lista_categorias= categorias;
 /*comprobando si la categoria incluida entre categorias del participante esta en la lista total de categorias y en caso negativo añadiendola*/
 if(existe_categoria(c_temporal) == 0){
 if(categorias == NULL){
 categorias= c_temporal;
 categorias->siguiente= c_temporal;
 categorias->anterior= c_temporal;
 }else{
 c_temporal->siguiente= categorias->siguiente;
 c_temporal->anterior= categorias;
- Código: Seleccionar todo
- categorias->siguiente->anterior= c_temporal;
 categorias->siguiente= c_temporal;
 categorias= categorias->siguiente;
 }
 }
 estado= leyendo_participante;
 f2++;
 }else{
 r=3;
 break;
 }
 }
 }
 fclose(archivo);
 }else{
 r=2;
 printf("Error abriendo archivo %s\n", ruta_archivo);
 }
 }else{
 r=1;
 }
 /*devolviendo las listas de participantes y categorias totales*/
 lista_participantes= participantes->siguiente;
 lista_categorias= categorias;
 return r;
 }
Lo pego en varios cachos para que no se corte.[/code]



 
