Respuesta: Problema con punteros, error: 0xC0000005 Margarito04, te pongo todo lo que tengo hecho del programa para AÑADIR:
/**** definición de estructura *****/
struct vuelos
{
int numero_vuelo;
char destino[30];
char horario_salida[5];
int numero_plazas_libres;
};
/******** definicion de funciones ************/
int menu (void);
//VISUALIZAR
void informacion_de_vuelos (void);
int num_vuelos (void);
struct vuelos *reserva_memoria (int *n_vuelos);
void vuelca_fichero_a_array (struct vuelos *p_vuelo, int *n_vuelos);
void visualizar (int *n_vuelos, struct vuelos *p_vuelo);
void libera_memoria (struct vuelos *p_vuelo);
//AÑADIR
void añadir_nuevo_vuelo (void);
struct vuelos pide_informacion (void);
int busca_posicion (struct vuelos *p_vuelo, struct vuelos nuevo_vuelo, int *n_vuelos);
void insertar (struct vuelos *p_vuelo, struct vuelos nuevo_vuelo, int *n_vuelos, int *posicion);
void vuelca_array_a_fichero (struct vuelos *p_vuelo, int *n_vuelos);
//ELIMINAR
void cancelar_vuelo (void);
int pide_n_vuelo (void);
void eliminar (struct vuelos *p_vuelo, int *n_vuelos, int *n_vuelo);
//MODIFICAR
void modificar_horario (void);
void pide_informacion_mod (int *vuelo, char *nuevo_horario);
void actualiza_informacion (struct vuelos *p_vuelo, int *n_vuelos, int *vuelo, char *nuevo_horario);
//ACTUALIZAR
void mod_plazas_libres (void);
void pide_info (int *vuelo, int *numero_plazas_ocupar);
void actualiza_info (struct vuelos *p_vuelo, int *vuelo, int *numero_plazas_ocupar);
/************ main *************/
void main (void)
{
int opcion;
printf("CONTROL DE VUELOS\n");
do
{
opcion=menu();
switch (opcion)
{
case 0:
{
printf("\n\nSALIR DEL PROGRAMA. Pulse cualquier tecla...");
getch();
break;
}
case 1:
{
printf("\n\nINFORMACION DE VUELOS\n\n");
informacion_de_vuelos ();
printf("\n\nPulse cualquier tecla para volver al menu...");
getch();
break;
}
case 2:
{
printf("\n\nAÑADIR NUEVO VUELO\n\n");
añadir_nuevo_vuelo ();
printf("\n\nPulse cualquier tecla para volver al menu...");
getch();
break;
}
case 3:
{
printf("\n\nCANCELAR UN VUELO\n\n");
cancelar_vuelo ();
printf("\n\nPulse cualquier tecla para volver al menu...");
getch();
break;
}
case 4:
{
printf("\n\nMODIFICAR HORARIO DE SALIDA DE UN VUELO\n\n");
modificar_horario ();
printf("\n\nPulse cualquier tecla para volver al menu...");
getch();
break;
}
case 5:
{
printf("\n\nACTUALIZAR EL NUMERO DE PLAZAS LIBRES DE UN VUELO\n\n");
mod_plazas_libres ();
printf("\n\nPulse cualquier tecla para volver al menu...");
getch();
break;
}
default:
{
printf("\n\nOPCION NO VALIDA. Pulse cualquier tecla para volver al menu...");
getch();
break;
}
}
}
while (opcion != 0);
}
/************************************************/
//Menu de opciones
int menu (void)
{
int opcion;
printf("\n\nMenu de opciones:\n\t0.- Salir del progarma\n\t1.- Informacion de vuelos\n\t2.- Añadir un nuevo vuelo\n\t3.- Cancelar un vuelo\n\t4.- Modificar horario de salida de un vuelo\n\t5.- Actualizar el numero de plazas libres de un vuelo\n");
scanf("%d", &opcion);
fflush(stdin); /*****limpia buffer de entrada*******/
return (opcion);
}
/
/**********ver cuantos registros tiene el fichero**********************************/
int num_vuelos (void)
{
FILE *punt_fich;
int n_vuelos = 0;
if ((punt_fich = fopen("Vuelos.ima", "rb")) != (FILE *)NULL)
{
fread(&n_vuelos, sizeof(int), 1, punt_fich);
fclose(punt_fich);
}
return(n_vuelos);
}
/***Reservamos memoria para el array y la identificamos con un puntero******/
struct vuelos *reserva_memoria (int *n_vuelos)
{
struct vuelos *p_vuelo;
p_vuelo = (struct vuelos *)malloc(*n_vuelos * sizeof(struct vuelos));
return (p_vuelo);
}
/***********Volcamos el fichero al array**************/
void vuelca_fichero_a_array (struct vuelos *p_vuelo, int *n_vuelos)
{
FILE *punt_fich;
int indice = 0;
if ((punt_fich = fopen("Vuelos.ima", "rb")) != (FILE *)NULL)
{
fseek(punt_fich, sizeof(int), SEEK_SET);
while (indice < *n_vuelos)
{
fread((p_vuelo + indice), sizeof(struct vuelos), 1, punt_fich);
indice++;
}
fclose(punt_fich);
}
}
/*******Visualizamos el array completo de la estructura*************/
void visualizar (int *n_vuelos, struct vuelos *p_vuelo)
{
int indice;
printf("%18s %18s %18s %18s", "N. VUELO", "DESTINO", "HORA DE SALIDA", "N.PLAZAS LIBRES");
for (indice = 0; indice< *n_vuelos; indice++)
{
printf("\n%18d %18s %18s %18d", (*(p_vuelo + indice)).numero_vuelo, (*(p_vuelo + indice)).destino, (*(p_vuelo + indice)).horario_salida, (*(p_vuelo + indice)).numero_plazas_libres);
}
}
/***************liberar memoria***************/
void libera_memoria (struct vuelos *p_vuelo)
{
free(p_vuelo);
}
//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);
}
}
Gracias y un saludo. |