Problema con estructuras[Ayuda]

Iniciado por Blaster, 7 Noviembre 2012, 18:02 PM

0 Miembros y 1 Visitante están viendo este tema.

Blaster

Alguien podria decirme en que estoy fallando, aka el codigo que estoy haciendo:

Código (cpp) [Seleccionar]
#include <stdio.h>

struct empleado{
    char nom[40];
    int asiento[3];
};
void ingresar(empleado d);
void asignarAsiento(empleado q[]);
void imprimir(empleado a);

int main()
{
     empleado e[3];
     asignarAsiento(e);
     for (int i=0; i!=3; ++i)
     imprimir(e[i]);
     return 0;
}
void ingresar(struct empleado d){
    printf("Nombre: ");
     scanf("%s", d.nom);
    printf("Asiento: ");
     scanf("%d", &d.asiento);
   }
void asignarAsiento(struct empleado q[]){
    int i, j;
    for(i=0; i<3; i++){
            ingresar(q[i]);
       for(j=0; j<i; j++) {
          if(q[i].asiento[j]==q[j].asiento[i]){
            printf ("Asiento ocupado\n");
            i--; break; }
               }
       }
}
void imprimir(struct empleado a){
    printf("Nombre\tAsiento");
    printf(" %s \t %d", a.nom, a.asiento);
}

A la hora de compilarlo el compilador me lanza dos errores:
error: cannot convert `empleado' to `empleado*' for argument `1' to `void asignarAsiento(empleado*)'
error: conversion from `empleado*' to non-scalar type `empleado' requested

rir3760

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 (cpp) [Seleccionar]
int main()
{
   empleado e[10];
   
   asignarAsiento(e);
   
   for (int i = 0; i != 10; ++i)
      imprimir(e[i]);
   
   return 0;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Blaster

#2
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   ;)

BatchianoISpyxolo

#3
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:

void ingresar(empleado d);

Debes pasar la referencia de d para poder modificarla.

#include <stdio.h>

typedef struct {
    char nom[40];
    int asiento[3];
} empleado;
void ingresar(empleado * d);
void asignarAsiento(empleado q[]);
void imprimir(empleado a);

int main()
{
   int i;
     empleado e[3];
     asignarAsiento(e);
     for (i=0; i<3; ++i)
       imprimir(e[i]);
     return 0;
}
void ingresar(empleado * d){
    printf("Nombre: ");
     scanf("%s", d->nom);
    printf("Asiento: ");
     scanf("%d", d->asiento);
   }
void asignarAsiento(empleado e[]){
   int i, j;
   for(i=0; i<3; i++){
       ingresar(&e[i]);
       for(j=0; j<i; j++) {

           if( *e[i].asiento == *e[j].asiento ){
               printf ("Asiento ocupado. Vuelva a intentarlo.\n");
               i--;
               break;
           }
       }
   }
}
void imprimir(empleado a){
    printf("Nombre: %s\tAsiento: %d\n", a.nom, *a.asiento);
}


Puede que te funcione.
Puede que desees aprender a programar desde 0: www.espascal.es

rir3760

Cita de: BatchianoISpyxolo en  7 Noviembre 2012, 22:08 PMDeclaras 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:
struct empleado{
   char nom[40];
   int asiento;
};


Con los cambios:
#include <stdio.h>

struct empleado{
   char nom[40];
   int asiento;
};

void ingresar(struct empleado *e);
void asignarAsiento(struct empleado *e);
void imprimir(struct empleado *e);

int main(void)
{
   struct empleado e[3];
   
   asignarAsiento(e);
   
   for (int i = 0; i != 3; ++i)
      imprimir(e + i);
   
   return 0;
}

void ingresar(struct empleado *e)
{
   printf("Nombre: ");
   scanf("%s", e->nom);
   
   printf("Asiento: ");
   scanf("%d", &e->asiento);
}

void asignarAsiento(struct empleado *e)
{
   int i;
   int j;
   
   i = 0;
   do {
      ingresar(e + i);
     
      for (j = 0; j < i && e[j].asiento != e[i].asiento; j++)
         ;
      if (i == j)
         i++;
      else
         puts("Asiento ocupado");
   }while (i < 3);
}

void imprimir(struct empleado *e){
     printf("Nombre\tAsiento");
     printf(" %s \t %d", e->nom, e->asiento);
}

Debería funcionar pero no lo revise, eso te toca a ti.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language