Ver Mensaje Individual
  #14 (permalink)  
Antiguo 23/06/2010, 05:28
GONZAB
 
Fecha de Ingreso: junio-2010
Mensajes: 5
Antigüedad: 13 años, 10 meses
Puntos: 0
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.