#1 Error utilizando "realloc"
Hola a todos estoy tratando de compilar esto y me salen unos garabatos alguien sabe porque?:
---------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned ID=0;//ID de las citas.
/*
1. Escriba un programa que permita gestionar una agenda de citas utilizando memoria
dinámica. La agenda contiene una serie de citas, ordenadas por fecha, cada una de las
cuales está compuesta por: la fecha en la que se celebrará, identificador y el asunto
que se desea tratar en la misma (100 caracteres como máximo, aunque deberás reservar
sólo los necesarios para que quepa la cadena). El programa presentará repetidamente,
mientras el usuario lo desee, un menú con las siguientes opciones:
a)Introducir una cita. Solicita al usuario la fecha y asunto de una nueva cita e
inserta,ordenadamente por fecha, la cita en la agenda. El identificador se genera
automáticamente.
b)Mostrar las citas de una fecha. Pide una fecha y muestra todas las citas
correspondientes a dicha fecha.
c)Actualizar la agenda. Solicita al usuario la fecha actual y elimina de la agenda
todas las citas anteriores a la fecha introducida.
d)Cancelar una cita. Solicita al usuario la fecha y asunto de una cita existente,
y elimina dicha cita de la agenda. Si no existe la cita, muestra un mensaje de error.
*/
typedef struct
{
int dia;
int mes;
int ano;
}fech;
typedef struct
{
unsigned id;
fech fecha;
char asunto[100];
}agenda;
void asignar(agenda **, int );
void nueva(agenda *, int *);
void ordenar(agenda *, int);
void buscar(agenda *, int );
void actualizar(agenda *, int *);
void imprimir(agenda *, int);
void eliminar(agenda *, int *);
int main()
{
int opc, pos=0;
agenda *a;
printf("WELCOME\n\n\n");
getchar();
system("clear");
do
{
printf("MENU\n\n\n1-Agregar Citas\n2-Mostrar Citas\n3-Actualizar\n4-Eliminar Cita\n#-Salir\n:: ");
scanf("%d", &opc);
switch(opc)
{
case 1:
a=(agenda *)realloc(a, (pos+1)*sizeof(agenda));
if(a==NULL)
printf("\nNo HAy espacio suficiente en memoria para esa operacion.\n");
else
{
nueva(a, &pos);
ordenar(a, pos);
}
break;
case 2: buscar(a, pos); break;
case 3:
actualizar(a, &pos);
imprimir(a, pos);
break;
case 4:
eliminar(a, &pos);
ordenar(a, pos);
imprimir(a, pos);
break;
}
}while(opc>=1 && opc<=4);
free(a);
return 0;
}
void nueva(agenda *a, int *pos)
{
ID++;
(a+(*pos))->id=ID;
printf("\nFecha del asunto\nDia: ");
scanf("%d", &(a+*pos)->fecha.dia);
printf("Mes: ");
scanf("Ano: ", &(a+(*pos))->fecha.mes);
printf(": ");
scanf("%d", &(a+(*pos))->fecha.ano);
printf("Asunto: "); scanf("%s", (a+(*pos))->asunto);
pos++;
printf("\n\n");
}
void ordenar(agenda *a, int pos)
{
int i, j, fmen, tmpf;
char tmpa[100];
unsigned tmpid;
for(i=0; i<pos-1; i++)
{
fmen=i;
for(j=fmen+1; j<pos; j++)
if( ((a+i)->fecha.ano)>((a+j)->fecha.ano) )
fmen=j;
else if( ((a+i)->fecha.mes)>((a+j)->fecha.mes) && ((a+i)->fecha.ano)>=((a+j)->fecha.ano))
fmen=j;
else if( ((a+i)->fecha.mes)>=((a+j)->fecha.mes) && ((a+i)->fecha.ano)>=((a+j)->fecha.ano) && ((a+i)->fecha.dia)>=((a+j)->fecha.dia) )
fmen=j;
if(fmen!=i)
{
//Intercambio de dias.
tmpf=((a+fmen)->fecha.dia);
((a+fmen)->fecha.dia)=(a+i)->fecha.dia;
(a+i)->fecha.dia=tmpf;
//Intercambio de meses.
tmpf=((a+fmen)->fecha.mes);
((a+fmen)->fecha.mes)=(a+i)->fecha.mes;
(a+i)->fecha.mes=tmpf;
//Intercambio de anos
tmpf=((a+fmen)->fecha.ano);
((a+fmen)->fecha.ano)=(a+i)->fecha.ano;
(a+i)->fecha.ano=tmpf;
//Intercambio de ID
tmpid=(a+fmen)->id;
(a+fmen)->id=(a+i)->id;
(a+i)->id=tmpid;
//Intercambio de Asuntos.
strcpy( tmpa, ((a+fmen)->asunto));
strcpy( ((a+fmen)->asunto), ((a+i)->asunto ));
strcpy( ((a+i)->asunto ) , tmpa );
}
}
}
void buscar(agenda *a, int pos)
{
int i, j=0;
int dia, mes, ano;
printf("\n\nBUSCADOR\n\nescriba el dia, fecha y hora de la cita: ");
scanf("%d%d%d", &dia, &mes, &ano);
for(i=0; i<pos; i++)
if( ((a+i)->fecha.dia == dia) && ((a+i)->fecha.mes == mes) &&((a+i)->fecha.dia == dia) )
{
printf("\nFecha: %d/%d/%d Asunto: %s\n\n", dia, mes, ano, (a+i)->asunto);
j++;
}
if(!j)
printf("\nNo se encontro la cita.\n\n");
}
void actualizar(agenda *a, int *pos)
{
int i, dia, mes, ano, j;
printf("\nEscribe dia, mes y ano actual: ");
scanf("%d%d%d", &dia, &mes, &ano);
for(i=0; i<*pos; i++)
if( (a+i)->fecha.dia<dia && (a+i)->fecha.mes<mes && (a+i)->fecha.ano<ano)
{
for(j=i; j<*pos-1; j++)
{
(a+j)->fecha.dia=(a+j+1)->fecha.dia;
(a+j)->fecha.mes=(a+j+1)->fecha.mes;
(a+j)->fecha.ano=(a+j+1)->fecha.ano;
strcpy( (a+j)->asunto, (a+j+1)->asunto );
}
i--;
(*pos)--;
}
printf("\n\nAgenda actualizada.\n\n");
}
void imprimir(agenda *a, int pos)
{
int i;
printf("\n\n");
if(pos!=0)
{
printf("========================================== =======\n");
printf(" AGENDA DE CITAS \n");
printf("========================================== =======\n");
for(i=0; i<pos; i++)
{
printf("ID: %u/tFecha %d/%d/%d.\n Asunto %s\n", (a+i)->id, (a+i)->fecha.dia, (a+i)->fecha.mes, (a+i)->fecha.ano, (a+i)->asunto);
printf("-------------------------------------------------\n\n");
}
}
else printf("\n\nNo hay entradas en la agenda.\n\n");
}
void eliminar(agenda *a, int *pos)
{
int i, dia, mes, ano, j;
char asunto[100];
printf("\nEscribe dia, mes y ano a borrar: ");
scanf("%d%d%d", &dia, &mes, &ano);
printf("Asunto a eliminar: ");
scanf("%s", asunto);
for(i=0; i<(*pos); i++)
if( (a+i)->fecha.dia==dia && (a+i)->fecha.mes==mes && (a+i)->fecha.ano==ano && (strcmp (asunto,(a+i)->asunto)== 0) )
{
for(j=i; j<(*pos)-1; j++)
{
(a+j)->fecha.dia=(a+j+1)->fecha.dia;
(a+j)->fecha.mes=(a+j+1)->fecha.mes;
(a+j)->fecha.ano=(a+j+1)->fecha.ano;
strcpy( (a+j)->asunto, (a+j+1)->asunto );
}
i--;
(*pos)--;
}
}
--------------------------------------------------
Y al seleccionar la opcion 1 me sale esto en la consola:
---------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned ID=0;//ID de las citas.
/*
1. Escriba un programa que permita gestionar una agenda de citas utilizando memoria
dinámica. La agenda contiene una serie de citas, ordenadas por fecha, cada una de las
cuales está compuesta por: la fecha en la que se celebrará, identificador y el asunto
que se desea tratar en la misma (100 caracteres como máximo, aunque deberás reservar
sólo los necesarios para que quepa la cadena). El programa presentará repetidamente,
mientras el usuario lo desee, un menú con las siguientes opciones:
a)Introducir una cita. Solicita al usuario la fecha y asunto de una nueva cita e
inserta,ordenadamente por fecha, la cita en la agenda. El identificador se genera
automáticamente.
b)Mostrar las citas de una fecha. Pide una fecha y muestra todas las citas
correspondientes a dicha fecha.
c)Actualizar la agenda. Solicita al usuario la fecha actual y elimina de la agenda
todas las citas anteriores a la fecha introducida.
d)Cancelar una cita. Solicita al usuario la fecha y asunto de una cita existente,
y elimina dicha cita de la agenda. Si no existe la cita, muestra un mensaje de error.
*/
typedef struct
{
int dia;
int mes;
int ano;
}fech;
typedef struct
{
unsigned id;
fech fecha;
char asunto[100];
}agenda;
void asignar(agenda **, int );
void nueva(agenda *, int *);
void ordenar(agenda *, int);
void buscar(agenda *, int );
void actualizar(agenda *, int *);
void imprimir(agenda *, int);
void eliminar(agenda *, int *);
int main()
{
int opc, pos=0;
agenda *a;
printf("WELCOME\n\n\n");
getchar();
system("clear");
do
{
printf("MENU\n\n\n1-Agregar Citas\n2-Mostrar Citas\n3-Actualizar\n4-Eliminar Cita\n#-Salir\n:: ");
scanf("%d", &opc);
switch(opc)
{
case 1:
a=(agenda *)realloc(a, (pos+1)*sizeof(agenda));
if(a==NULL)
printf("\nNo HAy espacio suficiente en memoria para esa operacion.\n");
else
{
nueva(a, &pos);
ordenar(a, pos);
}
break;
case 2: buscar(a, pos); break;
case 3:
actualizar(a, &pos);
imprimir(a, pos);
break;
case 4:
eliminar(a, &pos);
ordenar(a, pos);
imprimir(a, pos);
break;
}
}while(opc>=1 && opc<=4);
free(a);
return 0;
}
void nueva(agenda *a, int *pos)
{
ID++;
(a+(*pos))->id=ID;
printf("\nFecha del asunto\nDia: ");
scanf("%d", &(a+*pos)->fecha.dia);
printf("Mes: ");
scanf("Ano: ", &(a+(*pos))->fecha.mes);
printf(": ");
scanf("%d", &(a+(*pos))->fecha.ano);
printf("Asunto: "); scanf("%s", (a+(*pos))->asunto);
pos++;
printf("\n\n");
}
void ordenar(agenda *a, int pos)
{
int i, j, fmen, tmpf;
char tmpa[100];
unsigned tmpid;
for(i=0; i<pos-1; i++)
{
fmen=i;
for(j=fmen+1; j<pos; j++)
if( ((a+i)->fecha.ano)>((a+j)->fecha.ano) )
fmen=j;
else if( ((a+i)->fecha.mes)>((a+j)->fecha.mes) && ((a+i)->fecha.ano)>=((a+j)->fecha.ano))
fmen=j;
else if( ((a+i)->fecha.mes)>=((a+j)->fecha.mes) && ((a+i)->fecha.ano)>=((a+j)->fecha.ano) && ((a+i)->fecha.dia)>=((a+j)->fecha.dia) )
fmen=j;
if(fmen!=i)
{
//Intercambio de dias.
tmpf=((a+fmen)->fecha.dia);
((a+fmen)->fecha.dia)=(a+i)->fecha.dia;
(a+i)->fecha.dia=tmpf;
//Intercambio de meses.
tmpf=((a+fmen)->fecha.mes);
((a+fmen)->fecha.mes)=(a+i)->fecha.mes;
(a+i)->fecha.mes=tmpf;
//Intercambio de anos
tmpf=((a+fmen)->fecha.ano);
((a+fmen)->fecha.ano)=(a+i)->fecha.ano;
(a+i)->fecha.ano=tmpf;
//Intercambio de ID
tmpid=(a+fmen)->id;
(a+fmen)->id=(a+i)->id;
(a+i)->id=tmpid;
//Intercambio de Asuntos.
strcpy( tmpa, ((a+fmen)->asunto));
strcpy( ((a+fmen)->asunto), ((a+i)->asunto ));
strcpy( ((a+i)->asunto ) , tmpa );
}
}
}
void buscar(agenda *a, int pos)
{
int i, j=0;
int dia, mes, ano;
printf("\n\nBUSCADOR\n\nescriba el dia, fecha y hora de la cita: ");
scanf("%d%d%d", &dia, &mes, &ano);
for(i=0; i<pos; i++)
if( ((a+i)->fecha.dia == dia) && ((a+i)->fecha.mes == mes) &&((a+i)->fecha.dia == dia) )
{
printf("\nFecha: %d/%d/%d Asunto: %s\n\n", dia, mes, ano, (a+i)->asunto);
j++;
}
if(!j)
printf("\nNo se encontro la cita.\n\n");
}
void actualizar(agenda *a, int *pos)
{
int i, dia, mes, ano, j;
printf("\nEscribe dia, mes y ano actual: ");
scanf("%d%d%d", &dia, &mes, &ano);
for(i=0; i<*pos; i++)
if( (a+i)->fecha.dia<dia && (a+i)->fecha.mes<mes && (a+i)->fecha.ano<ano)
{
for(j=i; j<*pos-1; j++)
{
(a+j)->fecha.dia=(a+j+1)->fecha.dia;
(a+j)->fecha.mes=(a+j+1)->fecha.mes;
(a+j)->fecha.ano=(a+j+1)->fecha.ano;
strcpy( (a+j)->asunto, (a+j+1)->asunto );
}
i--;
(*pos)--;
}
printf("\n\nAgenda actualizada.\n\n");
}
void imprimir(agenda *a, int pos)
{
int i;
printf("\n\n");
if(pos!=0)
{
printf("========================================== =======\n");
printf(" AGENDA DE CITAS \n");
printf("========================================== =======\n");
for(i=0; i<pos; i++)
{
printf("ID: %u/tFecha %d/%d/%d.\n Asunto %s\n", (a+i)->id, (a+i)->fecha.dia, (a+i)->fecha.mes, (a+i)->fecha.ano, (a+i)->asunto);
printf("-------------------------------------------------\n\n");
}
}
else printf("\n\nNo hay entradas en la agenda.\n\n");
}
void eliminar(agenda *a, int *pos)
{
int i, dia, mes, ano, j;
char asunto[100];
printf("\nEscribe dia, mes y ano a borrar: ");
scanf("%d%d%d", &dia, &mes, &ano);
printf("Asunto a eliminar: ");
scanf("%s", asunto);
for(i=0; i<(*pos); i++)
if( (a+i)->fecha.dia==dia && (a+i)->fecha.mes==mes && (a+i)->fecha.ano==ano && (strcmp (asunto,(a+i)->asunto)== 0) )
{
for(j=i; j<(*pos)-1; j++)
{
(a+j)->fecha.dia=(a+j+1)->fecha.dia;
(a+j)->fecha.mes=(a+j+1)->fecha.mes;
(a+j)->fecha.ano=(a+j+1)->fecha.ano;
strcpy( (a+j)->asunto, (a+j+1)->asunto );
}
i--;
(*pos)--;
}
}
--------------------------------------------------
Y al seleccionar la opcion 1 me sale esto en la consola:
0