Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: dennis094 en 22 Noviembre 2013, 11:11 am



Título: Problema de tipos C
Publicado por: dennis094 en 22 Noviembre 2013, 11:11 am
Buenas, estoy intentando desarrollar un programa para practicar con structs y me piden que almacene informacion de personas, una vez hecho eso me piden almacenar la informacion de 2 personas (o mas) leida por teclado, e imprimirla.
Las funciones leer e imprimir deben ser diferentes, no puede leer e imprimir en la misma funcion.
Lo que tengo es esto, y en la penultima linea, cuando llamo a la funcion imprimir me da un error de tipos.
(En la funcion leer me da un error "leve" que me dice que no encuentra return, pero si lo saco fuera del for creo que no va a funcionar como debe).
Os dejo el codigo:

Código:
#include <stdio.h>
#include <stdlib.h>
// nombre sexo y edad (personas)
//a) leer; b) mostrar

struct persona{
char nombre[50];
char sexo[10];
int edad;
};

struct persona leer (void){
struct persona p[10]; // creamos las personas correspondientes
int i;

for (i=0;i<2;i++){
printf("Nombre: ");
gets(p[i].nombre);
printf("\nSexo: ");
gets(p[i].sexo);
printf("\nEdad: ");
scanf("%d", &p[i].edad);
fflush(stdin); // limpia el buffer de entrada despues de leer un entero

 return p[i];
}

}

void imprimir(struct persona p[10]){
int i;
for(i=0;i<2;i++){
printf("\n\n%s, %s de %d anyos.\n", p[i].nombre, p[i].sexo, p[i].edad);
}
}
int main(void) {
//leer();
imprimir(leer());
return 0;
}


Título: Re: Problema de tipos C
Publicado por: ivancea96 en 22 Noviembre 2013, 15:06 pm
El retorno es de una persona.

Imprimir te pide un array de diez personas.


Título: Re: Problema de tipos C
Publicado por: rir3760 en 22 Noviembre 2013, 18:11 pm
Como ya te indico ivancea96 el error se debe al tipo de retorno de la función "leer" y el argumento que espera la función "imprimir".

La función "leer" debe recibir como argumento el nombre del array y retornar el mismo (es en realidad un puntero, eso ya lo veras mas adelante):
Código
  1. struct persona *leer(struct persona persona[])
  2. {
  3.   int i;
  4.  
  5.   for (i = 0; i < NUM_PERSONAS; i++){
  6.      /* ... Lectura ... */
  7.   }
  8.  
  9.   return persona;
  10. }

La función "imprimir" recibe ese puntero y retornar nada (void):
Código
  1. void imprimir(struct persona persona[])
  2. {
  3.   int i;
  4.  
  5.   for (i = 0; i < NUM_PERSONAS; i++){
  6.      /* ... Escritura ... */
  7.   }
  8. }

Por ultimo en la función main debes declarar el array, lo usual es indicar el numero de elementos con una macro:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define NUM_PERSONAS 2
  5.  
  6. /* ... */
  7.  
  8. int main(void)
  9. {
  10.   struct persona persona[NUM_PERSONAS];
  11.  
  12.   imprimir(leer(persona));
  13.  
  14.   return 0;
  15. }

Ademas deberías manejar el sexo como una variable de tipo char ('M', 'F', etc.). También debes evitar el uso de gets y fflush(stdin), mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

Un saludo