Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Segmentation fault

Estas en el tema de Segmentation fault en el foro de C/C++ en Foros del Web. Hola! Me da este error en tiempo de ejecución. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C: Ver original typedef struct {     unsigned short int ano , ...
  #1 (permalink)  
Antiguo 17/05/2009, 13:24
 
Fecha de Ingreso: diciembre-2008
Mensajes: 9
Antigüedad: 15 años, 4 meses
Puntos: 0
Exclamación Segmentation fault

Hola!

Me da este error en tiempo de ejecución.

Código C:
Ver original
  1. typedef struct
  2. {
  3.     unsigned short int ano, mes, dia, hora, min, seg;
  4. }tipo_fecha;
  5.  
  6. //Tipo de dato usuario.
  7. typedef struct
  8. {
  9.     char login[21], password[21], nombre[21], apellido[42], ext[6];
  10.     tipo_fecha ult_reserva;
  11. }tipo_usuario;
  12.  
  13. //Tipo de dato reserva
  14. typedef struct
  15. {
  16.     unsigned short int ocupado;
  17.     tipo_usuario usuario;
  18. }tipo_reserva;
  19.  
  20. void consultar_reservas_mes(tipo_reserva *matriz_reservas)
  21. {
  22.     printf("1");    
  23.     int mes, dia, hora;
  24.     int tamanho;
  25.     tamanho=sizeof(tipo_reserva);
  26.     /*do
  27.     {
  28.                               printf("\nNumero del mes a consultar: ");scanf("%d",&mes);
  29.         /*if ((mes>12) || (mes<1)) printf("\nNumero de mes no valido.\n");
  30.         else break;
  31.     }while(1);*/
  32.     mes=8;
  33.     printf("prueba 2 %d",&tamanho);
  34.    
  35.     //Recorro la matriz_reservas buscandos los unos en la matriz_reservas.ocupado e imprimo la reserva;
  36.     for (dia=0;dia<31;dia++) for (hora=0;hora<10;hora++)
  37.     {    
  38.         if ( (matriz_reservas+(tamanho*10*30*mes)+(10*tamanho*dia)+(tamanho*hora))->ocupado!=0)
  39.         {
  40.             printf("\nEl dia %d del mes %d a las %d la sala ha sido reservada por %s %s\n"
  41.                    ,dia,mes,hora,(matriz_reservas+(tamanho*12*30*mes)+(12*tamanho*dia)+(tamanho*hora))->usuario.nombre,
  42.                     (matriz_reservas+(tamanho*10*30*mes)+(10*tamanho*dia)+(tamanho*hora))->usuario.apellido);
  43.         }
  44.     }
  45. }
  46.  
  47. int main()  
  48. {
  49.     //Declaración de las variables
  50.     char basura;
  51.     unsigned short int mes,dia,hora;
  52.     char opcion,confirmacion;
  53.     char nombre[STRING_CORTO], password[STRING_CORTO];
  54.     tipo_usuario usuario;
  55.     tipo_fecha fecha;
  56.     //los índices de los arrays: mes,dia,hora
  57.     tipo_reserva matriz_reservas[12][31][12];
  58.    
  59.     //Pongo todas las reservas a 0.
  60.     for (mes=0;mes<12;mes++) for (dia=0;dia<31;dia++) for (hora=0;hora<12;hora++) matriz_reservas[mes][dia][hora].ocupado=0;
  61.    
  62.     do
  63.     {
  64.         printf("\nEscoja una opcion:\n");
  65.         printf("\n1 - Loguearse\n2 - Salir\n");
  66.         scanf("%d",&opcion);
  67.         scanf("%c",&basura);
  68.         if (opcion==1)
  69.         {
  70.             if (/*login(usuario)*/1)
  71.             {
  72.                 printf("\nLogueado correctamente\n");
  73.                 do
  74.                 {
  75.                     opcion=menu();
  76.                     scanf("%c",&basura);
  77.                     switch(opcion)
  78.                     {
  79.                         case 1: introducir_datos(&usuario);                    
  80.                             break;
  81.                         case 2: consultar_reservas_mes(&matriz_reservas[0][0][0]);//Aquí es donde invoco la funcion
  82.                             break;
  83.                         case 3:
  84.                             //consultar_reservas_usuario(matriz_reservas, usuario);
  85.                             break;
  86.                         case 4:
  87.                             if (usuario.nombre[0]==0) printf("\a\nIntroduzca primero sus datos\n\n");
  88.                             else
  89.                             {
  90.                                 do
  91.                                 {
  92.                                     printf("\nDatos de la reserva:\n   Mes: ");scanf("%d",&fecha.mes);
  93.                                     printf("   Dia: ");scanf("%d",&fecha.dia);
  94.                                     printf("   Hora a reservar (de 8 a 20): ");scanf("%d",&fecha.hora);
  95.                                     if ((validar_fecha(fecha)) || ((fecha.hora<21) && (fecha.hora>7))) break;
  96.                                     else printf("\a\nFecha u hora incorrecta\n");
  97.                                 }while(1);
  98.                                 if (matriz_reservas[fecha.mes][fecha.dia][fecha.hora].ocupado==0)
  99.                                 {
  100.                                     printf("Realizar la reseva? (S/N): ");scanf("%s",&confirmacion);
  101.                                     if ((strcmp(&confirmacion,"S")==0) || (strcmp(&confirmacion,"s")==0))
  102.                                     {
  103.                                         matriz_reservas[fecha.mes][fecha.dia][fecha.hora].ocupado=1;
  104.                                         strcpy(matriz_reservas[fecha.mes][fecha.dia][fecha.hora].usuario.nombre,usuario.nombre);
  105.                                         strcpy(matriz_reservas[fecha.mes][fecha.dia][fecha.hora].usuario.apellido,usuario.apellido);
  106.                                         strcpy(matriz_reservas[fecha.mes][fecha.dia][fecha.hora].usuario.ext,usuario.ext);
  107.                                         usuario.ult_reserva=fecha;
  108.                                         printf("\n\nEl dia %d del mes %d a las %d la sala ha sido reservada por %s %s\n\n"
  109.                                                    ,fecha.dia,fecha.mes,fecha.hora,matriz_reservas[fecha.mes][fecha.dia][fecha.hora].usuario.nombre,matriz_reservas[fecha.mes][fecha.dia][fecha.hora].usuario.apellido);
  110.                                     }
  111.                                     else printf("\nReserva no realizada\n");
  112.                                 }
  113.                                 else printf("\nFecha no disponible\n");
  114.                             }
  115.                             break;
  116.                         case 5:
  117.                             if (usuario.nombre[0]==0) printf("\a\nIntroduzca primero sus datos\n\n");
  118.                             else
  119.                             {
  120.                                 do
  121.                                 {
  122.                                     printf("\nDatos de la reserva a borrar:\n   Mes: ");scanf("%d",&fecha.mes);
  123.                                     printf("   Dia: ");scanf("%d",&fecha.dia);
  124.                                     printf("   Hora (de 8 a 20): ");scanf("%d",&fecha.hora);
  125.                                     if ((validar_fecha(fecha)) || ((fecha.hora<21) && (fecha.hora>7))) break;
  126.                                     else printf("\a\nFecha u hora incorrecta\n");
  127.                                 }while(1);
  128.                                 if (matriz_reservas[fecha.mes][fecha.dia][fecha.hora].ocupado==0) printf("\nNo hay ninguna reserva para esta fecha y esta hora\n");
  129.                                 else
  130.                                 {
  131.                                     if ((strcmp(matriz_reservas[fecha.mes][fecha.dia][fecha.hora].usuario.nombre,usuario.nombre)==0) &&
  132.                                                     (strcmp(matriz_reservas[fecha.mes][fecha.dia][fecha.hora].usuario.apellido,usuario.apellido)==0))
  133.                                     {
  134.                                         printf("\n\nEl dia %d del mes %d a las %d la sala ha sido reservada por %s %s\n\n",
  135.                                         fecha.dia,fecha.mes,fecha.hora,matriz_reservas[fecha.mes][fecha.dia][fecha.hora].usuario.nombre,
  136.                                         matriz_reservas[fecha.mes][fecha.dia][fecha.hora].usuario.apellido);
  137.                                         printf("Borrar la reseva? (S/N): ");scanf("%s",&confirmacion);
  138.                                         if ((strcmp(&confirmacion,"S")==0) || (strcmp(&confirmacion,"s")==0))
  139.                                         {
  140.                                             matriz_reservas[fecha.mes][fecha.dia][fecha.hora].ocupado=0;
  141.                                             printf("\nReserva borrada\n");
  142.                                         }
  143.                                     }
  144.                                     else printf("\nNo se puede borrar la reseva ya que el usuario actual no coincide con el de la reserva\n");
  145.                                 }
  146.                             }  
  147.                             break;
  148.                         case 6: break;  
  149.                         default: printf("\a\nOpcion incorrecta\n");
  150.                             break;
  151.                     }
  152.                 }while(opcion!=6);
  153.             }
  154.             else printf("\a\n\nUsuario o Password incorrectos\n\n");
  155.         }
  156.         else if (opcion==2)
  157.         {
  158.             break;
  159.         }
  160.         else
  161.         {
  162.             printf("\a\nOpcion incorrecta\n");
  163.         }
  164.     }while(1);
  165.     printf("\nFIN DEL PROGRAMA\n\n");
  166. }


No me llega ni a imprimir el "1" por pantalla. Llevo probado mil cosas y no sé. Empiezo a desesperarme. No he puesto todas las funciones que tengo pa no liar.

Venga, un saludo y muchas gracias por adelantado!
  #2 (permalink)  
Antiguo 17/05/2009, 14:09
Avatar de Claw  
Fecha de Ingreso: abril-2009
Mensajes: 299
Antigüedad: 15 años
Puntos: 9
Respuesta: Segmentation fault

¿Has probado a depurar el código?

Salu2
  #3 (permalink)  
Antiguo 17/05/2009, 14:13
 
Fecha de Ingreso: diciembre-2008
Mensajes: 9
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Segmentation fault

Depurar? Eso serviría para ver la línea que "falla", no? Cómo se hace con gcc?

Gracias y un saludo!
  #4 (permalink)  
Antiguo 17/05/2009, 14:43
 
Fecha de Ingreso: diciembre-2008
Mensajes: 31
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Segmentation fault

con el gcc compilas con "-g"

ej

gcc ejemplo1.c -g

esto te hace un ejecutable "a.out" porque no definiste el nombre que le querias dar en el ejemplo (spongo que ya sabes como compilarlo)

bueno una vez q compilaste con -g

pones

gdb "nombre de archivo"

y listo entras al gdb..
  #5 (permalink)  
Antiguo 17/05/2009, 15:25
 
Fecha de Ingreso: diciembre-2008
Mensajes: 9
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Segmentation fault

Y como avanzo de línea en línea?

No sé que hacer ahora.

Gracias!
  #6 (permalink)  
Antiguo 17/05/2009, 21:48
 
Fecha de Ingreso: diciembre-2008
Mensajes: 9
Antigüedad: 15 años, 4 meses
Puntos: 0
De acuerdo Respuesta: Segmentation fault

Ya sé cuál es el error! El fallo estaba en que no había entendido bien la utilización de "->". Creí que necesitaba mover el puntero hasta que apuntase al elemento que quería utilizar, pero me he dado cuenta de que lo hace automáticamente, y sólo hay que indicar las dimensiones del array.

Muchas gracias de todas formas!
  #7 (permalink)  
Antiguo 18/05/2009, 03:02
poi
 
Fecha de Ingreso: octubre-2008
Mensajes: 73
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: Segmentation fault

Utiliza el valgrind para ese tipo de errores de memoria. Te dice donde falla y porque falla.
  #8 (permalink)  
Antiguo 18/05/2009, 03:13
 
Fecha de Ingreso: diciembre-2008
Mensajes: 9
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Segmentation fault

Todavía no sé utilizar el depurador de gcc... así que paso por paso.

El error ya está solucionado. Era un error al usar ->. Pero me gustaría aprender a utilizar el depurador de gcc, para próximos errores.

¿Me recomendáis alguna guía o algo?

Muchísimas gracias. Un saludo!
  #9 (permalink)  
Antiguo 18/05/2009, 11:52
Avatar de Claw  
Fecha de Ingreso: abril-2009
Mensajes: 299
Antigüedad: 15 años
Puntos: 9
Respuesta: Segmentation fault

¿gdb? Yo encontré una guía hace poco que me fue bastante útil:

http://crysol.inf-cr.uclm.es/es/node/267

Salu2
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:21.