Alguien podria decirme en que estoy fallando, aka el codigo que estoy haciendo:
#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
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í:
int main()
{
empleado e[10];
asignarAsiento(e);
for (int i = 0; i != 10; ++i)
imprimir(e[i]);
return 0;
}
Un saludo
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 ;)
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.
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