Ver Mensaje Individual
  #9 (permalink)  
Antiguo 18/06/2010, 04:47
GONZAB
 
Fecha de Ingreso: junio-2010
Mensajes: 5
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Problema con punteros, error: 0xC0000005

Gracias por responder margarito04.

La estructura de datos de vuelos es:
struct vuelos
{
int numero_vuelo;
char destino[30];
char horario_salida[5];
int numero_plazas_libres;
};


n_vuelos vale 2 y posición vale 0, por lo que el indice en el for va de 1 a 0, pero cuando toma el valor 1 ya da el error, antes de llegar a tomar el valor 0.

Se trata de insertar un vuelo en la estructura y luego pasarlo a fichero, de la siguiente forma:

//AÑADIR

void añadir_nuevo_vuelo (void)
{
int n_vuelos, posicion;
struct vuelos *p_vuelo;
struct vuelos nuevo_vuelo;

n_vuelos = num_vuelos();
n_vuelos++;
p_vuelo = reserva_memoria (&n_vuelos);
n_vuelos--;
vuelca_fichero_a_array (p_vuelo, &n_vuelos);
nuevo_vuelo = pide_informacion();
posicion = busca_posicion (p_vuelo, nuevo_vuelo, &n_vuelos);
n_vuelos++;
insertar (p_vuelo, nuevo_vuelo, &n_vuelos, &posicion);
vuelca_array_a_fichero (p_vuelo, &n_vuelos);
libera_memoria (p_vuelo);
}

/**********Pide informacion del elemento a añadir************************/

struct vuelos pide_informacion(void)
{
struct vuelos nuevo_vuelo;

printf("\tDestino ---> ");
gets(nuevo_vuelo.destino);
printf("\tHorario de salida ---> ");
gets(nuevo_vuelo.horario_salida);
printf("\tNumero de plazas libres ---> ");
scanf("%d", &nuevo_vuelo.numero_plazas_libres);
fflush(stdin);

return (nuevo_vuelo);
}

/*************Ver la posicion del elemento a añadir***********************/

int busca_posicion (struct vuelos *p_vuelo, struct vuelos nuevo_vuelo, int *n_vuelos)
{
int indice = 0, comprobacion;
int inicio = 0, final, mitad, posicion;
final = *n_vuelos-1;
mitad = (inicio+final) / 2;

do
{
comprobacion=strcmp((*(p_vuelo+mitad)).horario_sal ida, nuevo_vuelo.horario_salida);
if(comprobacion < 0)
inicio = mitad + 1;
if(comprobacion > 0)
final = mitad - 1;

mitad = (inicio + final) / 2;
}
while (inicio < final && comprobacion != 0);

if (comprobacion <= 0)
posicion = mitad + 1;
else
posicion = mitad;

return(posicion);
}

/**********************Insertar el nuevo elemento en su sitio***************/

void insertar (struct vuelos *p_vuelo, struct vuelos nuevo_vuelo, int *n_vuelos, int *posicion)
{
int indice;

if (*n_vuelos > 1)
{
for(indice = *n_vuelos - 1; indice >= *posicion; indice--)
{
strcpy((*(p_vuelo + indice)).destino, (*(p_vuelo + indice - 1)).destino);
strcpy((*(p_vuelo + indice)).horario_salida, (*(p_vuelo + indice - 1)).horario_salida);
(*(p_vuelo+indice)). numero_plazas_libres = (*(p_vuelo + indice - 1)).numero_plazas_libres;
(*(p_vuelo+indice)).numero_vuelo = indice+1;
}
}
strcpy((*(p_vuelo + *posicion - 1)).destino, nuevo_vuelo.destino);
strcpy((*(p_vuelo + *posicion - 1)).horario_salida, nuevo_vuelo.horario_salida);
(*(p_vuelo + *posicion - 1)).numero_plazas_libres = nuevo_vuelo.numero_plazas_libres;
(*(p_vuelo + *posicion - 1)).numero_vuelo = *posicion;
}

/*****************Vuelca el array al fichero*********************/

void vuelca_array_a_fichero (struct vuelos *p_vuelo, int* n_vuelos)
{
FILE* punt_fich;
int indice;

if ((punt_fich = fopen("Vuelos.ima", "wb")) != (FILE*)NULL)
{
fwrite(n_vuelos, sizeof(int) , 1, punt_fich);
for(indice = 0; indice < *n_vuelos; indice++)
{
fwrite((p_vuelo + indice), sizeof(struct vuelos), 1, punt_fich);
}
fclose (punt_fich);
}
}

Me da el problema en la primera inserción. No sé si en las siguientes podría ir bien.

Muchas gracias y Saludos.