Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Blaster en 7 Noviembre 2012, 18:02 pm



Título: Problema con estructuras[Ayuda]
Publicado por: Blaster en 7 Noviembre 2012, 18:02 pm
Alguien podria decirme en que estoy fallando, aka el codigo que estoy haciendo:

Código
  1. #include <stdio.h>
  2.  
  3. struct empleado{
  4.     char nom[40];
  5.     int asiento[3];
  6. };
  7. void ingresar(empleado d);
  8. void asignarAsiento(empleado q[]);
  9. void imprimir(empleado a);
  10.  
  11. int main()
  12. {
  13.      empleado e[3];
  14.      asignarAsiento(e);
  15.      for (int i=0; i!=3; ++i)
  16.      imprimir(e[i]);
  17.      return 0;
  18. }
  19. void ingresar(struct empleado d){
  20.     printf("Nombre: ");
  21.      scanf("%s", d.nom);
  22.     printf("Asiento: ");
  23.      scanf("%d", &d.asiento);
  24.    }
  25. void asignarAsiento(struct empleado q[]){
  26.     int i, j;
  27.     for(i=0; i<3; i++){
  28.             ingresar(q[i]);
  29.        for(j=0; j<i; j++) {
  30.           if(q[i].asiento[j]==q[j].asiento[i]){
  31.             printf ("Asiento ocupado\n");
  32.             i--; break; }
  33.                }
  34.        }
  35. }
  36. void imprimir(struct empleado a){
  37.     printf("Nombre\tAsiento");
  38.     printf(" %s \t %d", a.nom, a.asiento);
  39. }
  40.  
A la hora de compilarlo el compilador me lanza dos errores:
 
Código:
error: cannot convert `empleado' to `empleado*' for argument `1' to `void asignarAsiento(empleado*)' 
Código:
error: conversion from `empleado*' to non-scalar type `empleado' requested


Título: Re: Problema con estructuras[ayuda]
Publicado por: rir3760 en 7 Noviembre 2012, 18:41 pm
El error se genera debido a que la función "asignarAsiento" espera que su argumento sea la dirección en memoria de un objeto de tipo "empleado". Si eso te suena muy técnico y complicado no lo es: ello se realiza cada vez que llamas a una función y el argumento se indica mediante el nombre de un array.

En buen cristiano: para utilizar esa función debes declarar un array y pasarlo a la función, como no lo haces se genera el error que mencionas.

Para solucionarlo debes, entre otras cosas, declarar el array (y tampoco llamar directamente a la función "ingresar"), mas o menos así:
Código
  1. int main()
  2. {
  3.   empleado e[10];
  4.  
  5.   asignarAsiento(e);
  6.  
  7.   for (int i = 0; i != 10; ++i)
  8.      imprimir(e[i]);
  9.  
  10.   return 0;
  11. }

Un saludo


Título: Re: Problema con estructuras[Ayuda]
Publicado por: Blaster en 7 Noviembre 2012, 20:15 pm
Modifique el codigo como me lo habias dicho, pero no obtengo la salida deseada
 ya que quiero que me imprima, el nombre y el asiento que ocupa el empleado.
Y ademas no me detecta si el asiento esta o no ocupado, estoy todo liado con
 esto de las estructuras.

Desde ya muchas gracias   ;)


Título: Re: Problema con estructuras[Ayuda]
Publicado por: BatchianoISpyxolo en 7 Noviembre 2012, 22:08 pm
Declaras empleados e[3], sin haber hecho un typedef de la struct y luego usas la struct... etc etc.

Se consecuente con tus declaraciones y con los parámetros que tus funciones reciben y los argumentos que pasas al llamarlas.

Además ten cuidado con cosas como esta:

Código
  1. void ingresar(empleado d);

Debes pasar la referencia de d para poder modificarla.

Código
  1. #include <stdio.h>
  2.  
  3. typedef struct {
  4.     char nom[40];
  5.     int asiento[3];
  6. } empleado;
  7. void ingresar(empleado * d);
  8. void asignarAsiento(empleado q[]);
  9. void imprimir(empleado a);
  10.  
  11. int main()
  12. {
  13.    int i;
  14.      empleado e[3];
  15.      asignarAsiento(e);
  16.      for (i=0; i<3; ++i)
  17.        imprimir(e[i]);
  18.      return 0;
  19. }
  20. void ingresar(empleado * d){
  21.     printf("Nombre: ");
  22.      scanf("%s", d->nom);
  23.     printf("Asiento: ");
  24.      scanf("%d", d->asiento);
  25.    }
  26. void asignarAsiento(empleado e[]){
  27.    int i, j;
  28.    for(i=0; i<3; i++){
  29.        ingresar(&e[i]);
  30.        for(j=0; j<i; j++) {
  31.  
  32.            if( *e[i].asiento == *e[j].asiento ){
  33.                printf ("Asiento ocupado. Vuelva a intentarlo.\n");
  34.                i--;
  35.                break;
  36.            }
  37.        }
  38.    }
  39. }
  40. void imprimir(empleado a){
  41.     printf("Nombre: %s\tAsiento: %d\n", a.nom, *a.asiento);
  42. }
  43.  

Puede que te funcione.


Título: Re: Problema con estructuras[Ayuda]
Publicado por: rir3760 en 8 Noviembre 2012, 16:30 pm
Declaras empleados e[3], sin haber hecho un typedef de la struct y luego usas la struct...
Es valido siempre y cuando el lenguaje, a pesar de todas las apariencias, no sea C sino C++ (a veces pasa).

Y si un empleado solo puede tener un asiento asignado hay que cambiar la definicion de la estructura a:
Código
  1. struct empleado{
  2.   char nom[40];
  3.   int asiento;
  4. };

Con los cambios:
Código
  1. #include <stdio.h>
  2.  
  3. struct empleado{
  4.   char nom[40];
  5.   int asiento;
  6. };
  7.  
  8. void ingresar(struct empleado *e);
  9. void asignarAsiento(struct empleado *e);
  10. void imprimir(struct empleado *e);
  11.  
  12. int main(void)
  13. {
  14.   struct empleado e[3];
  15.  
  16.   asignarAsiento(e);
  17.  
  18.   for (int i = 0; i != 3; ++i)
  19.      imprimir(e + i);
  20.  
  21.   return 0;
  22. }
  23.  
  24. void ingresar(struct empleado *e)
  25. {
  26.   printf("Nombre: ");
  27.   scanf("%s", e->nom);
  28.  
  29.   printf("Asiento: ");
  30.   scanf("%d", &e->asiento);
  31. }
  32.  
  33. void asignarAsiento(struct empleado *e)
  34. {
  35.   int i;
  36.   int j;
  37.  
  38.   i = 0;
  39.   do {
  40.      ingresar(e + i);
  41.  
  42.      for (j = 0; j < i && e[j].asiento != e[i].asiento; j++)
  43.         ;
  44.      if (i == j)
  45.         i++;
  46.      else
  47.         puts("Asiento ocupado");
  48.   }while (i < 3);
  49. }
  50.  
  51. void imprimir(struct empleado *e){
  52.     printf("Nombre\tAsiento");
  53.     printf(" %s \t %d", e->nom, e->asiento);
  54. }
Debería funcionar pero no lo revise, eso te toca a ti.

Un saludo