Hola de nuevo. Aquí vengo con una nueva duda sobre C, en este caso sobre estructuras. Alguien podría decirme en qué falla mi programa?. Muchas gracias por su ayuda.
/*struct dentro de un struct.*/
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define N 100
typedef struct
{
int dia;
int mes;
int anyo;
}fnac;
typedef struct
{
char nombre[80];
char apellido[80];
struct fnac;
}tpersonas;
/*Prototipos de las funciones.*/
int numpersonas(void);
tpersonas* asignamemoria(int);
fnac* asignamemoria2(int);
int lee(tpersonas*,fnac*,int);
int menu();
int visualiza(tpersonas*,fnac*,int);
int liberamemoria(tpersonas*,fnac*);
/*Función main.*/
main()
{
int npersonas,op,i;
tpersonas *personas;
fnac *personass;
i=0;
while((op=menu())!=5)
{
switch(op)
{
case 1: numpersonas();
break;
case 2: personas=asignamemoria(npersonas);
if(personas==NULL) return -1;
personass=asignamemoria2(npersonas);
if(personass=NULL) return -1;
break;
case 3: while(i<npersonas)
{
i=lee(personas,personass,i);
}
break;
case 4: clrscr();
visualiza(personas,personass,npersonas);
break;
default: printf("\n Pulse 4 para salir.");
break;
}
}
liberamemoria(personas,personass);
printf("\n Fin de programa. Pulse cualquier tecla para finalizar.");
getch();
}
int menu()
{
int op;
do{
clrscr();
printf("\n\t\t 1.Introducir numero de personas.");
printf("\n\t\t 2.Asignar memoria.");
printf("\n\t\t 3.Entrada de datos.");
printf("\n\t\t 4.Visualizar datos.");
printf("\n\t\t 5.Salir.");
printf("\n\t Seleccion opcion: ");
scanf("%d",&op);
}while(op<1 || op>5);
return op;
}
int numpersonas(void)
{
int ok,np;
do{
clrscr();
printf("\n Introduce numero de personas: ");
ok=scanf("%d",&np);
} while((!ok) || (np<=0));
return np;
}
tpersonas * asignamemoria(int np)
{
tpersonas * q;
q=(tpersonas*)malloc(np*sizeof(tpersonas));
if(q==NULL) return NULL;
return q;
}
fnac * asignamemoria2(int np)
{
fnac * w;
w=(fnac*)malloc(np*sizeof(fnac));
if(w==NULL) return NULL;
return w;
}
int lee(tpersonas *p,fnac *f,int n) //n equivale a i en el main.. sirve para recorrer.
{
char sn[1];
do{
clrscr();
printf("\n Persona %d",n+1);
printf("\n Nombre: "); gets(p[n].nombre);
printf("\n Apellido: "); gets(p[n].apellido);
printf("\n Fecha nacimiento: ");
printf("\n\t Dia: "); scanf("%d",&f[n].dia);
printf("\n\t Mes: "); scanf("%d",&f[n].mes);
printf("\n\t Anyo: "); scanf("%d",&f[n].anyo);
printf("\n Datos correctos(s/n)? ");
scanf("%s",&sn[0]);
} while((sn[0]!='s') || (sn[0]!='S'));
return n+1;
}
int visualiza(tpersonas *p,fnac *f,int np)
{
int i;
for(i=0;i<np;i++)
{
clrscr();
printf("\n Persona %d",i+1);
printf("\n Nombre: "); puts(p[i].nombre);
printf("\n Apellido: "); puts(p[i].apellido);
printf("\n Fecha nacimiento: ");
printf("\n\t Dia: %d",f[i].dia);
printf("\n\t Mes: %d",f[i].mes);
printf("\n\t Anyo: %d",f[i].anyo);
getch();
}
return 0;
}
int liberamemoria(tpersonas *p,fnac *f)
{
free(p);
free(f);
return 0;
}