2012-09-29 11 views
6

Tengo el siguiente unión:¿Cómo acceder a un miembro de la estructura dentro de una unión en C?

union employee 
{ 
    char key; 

    struct manager 
    { 
     short int age; 
     float shares; 
     short int level; 
    }; 

    struct worker 
    { 
     short int age; 
     short int skill; 
     short int department; 
    }; 

} company[10]; 

¿Cómo puedo acceder a un miembro de una estructura que está dentro de la unión employee? traté de acceder al miembro de age de la estructura manager esta manera:

company[i].manager.age

Pero consigo error C2039: 'manager' : is not a member of 'employee'.

Respuesta

8

Agregue algo después de la declaración de la etiqueta. Tal vez:

struct manager 
{ 
    short int age; 
    float shares; 
    short int level; 
} manager; 

Nota al margen: no se está usando el derecho sindical. La clave, es decir, el campo que le dice si está tratando con un gerente o con un simple trabajador, debe estar en un objeto adjunto, , fuera de la unión. Tal vez:

struct employee { 
    char key; 

    union { 
     struct manager ...; 
     struct worker ...; 
    } u; 
}; 

Como dasblinkenlight notas, se puede declarar sus etiquetas gestor/trabajador fuera de la unión.

+0

+1 ¡La observación sobre el uso de la tecla 'union' es excelente! Es posible que desee mencionar que no es necesario dar etiquetas 'struct' a' worker' y 'manager' dentro de' union'. – dasblinkenlight

+0

Ah, ahora me doy cuenta de lo que hice allí ... Me olvidé por completo de usar una unión. – amiregelz

2

Estructuras/uniones anónimas no es parte del estándar C, sino una extensión de GNU no muy extendida.

En su ejemplo particular, algunos compiladores (principalmente GCC) le permitirán acceder a las variables únicas del administrador y del trabajador a través, p. Ej. company[i].shares o company[i].department, pero company[i].age es ambiguo y el compilador no sabrá a qué se refiere. Su enfoque es similar al tratar de definir

union { 
     int num; 
     float num; 
} union_number; 

que ni siquiera es válida C.

hay dos maneras de resolver esto.

a) mover los atributos compartidos fuera de la estructura (la forma de GNU mal, por favor, no hagas eso, sé que es un hecho que la CPI no tiene ni siquiera compilar este)

union employee 
{ 
    char key; 

    struct person { 
     short int age; 

     union { 
      struct manager 
      { 
       float shares; 
       short int level; 
      }; 

      struct worker 
      { 
       short int skill; 
       short int department; 
      }; 
     } 
    }; 

} company[10]; 

b) o la forma estandarizada más limpia para nombrar sus estructuras:

union employee 
{ 
    char key; 

    struct manager 
    { 
     short int age; 
     float shares; 
     short int level; 
    } manager; 

    struct worker 
    { 
     short int age; 
     short int skill; 
     short int department; 
    } worker; 

} company[10]; 

en este caso, usted será capaz de acceder a los elementos a través de struct company[i].manager.age, company[i].worker.skill y así sucesivamente.

Tenga en cuenta que en el tiempo de ejecución no hay manera de comprobar si su sindicato contiene una clave, un gerente o un trabajador. Eso debe saberse de antemano.

Otra cosa: no estoy seguro de si esto es así, pero en su declaración no puede guardar una clave junto con un gerente o un trabajador. Su sindicato contiene solo uno de clave, gerente o trabajador

+0

Sí, me di cuenta de que después de cnicutar señaló eso.a continuación, lo cambié a: 'struct empresa { \t Char clave; \t sindicato de empleados \t { \t \t gerente estructura \t \t { \t \t \t short int edad; \t \t \t acciones de flotación; \t \t \t nivel int corto; \t \t} manager; \t \t trabajador estructura \t \t { \t \t \t short int edad; \t \t \t corto habilidad int; \t \t \t corta departamento int; \t \t} trabajador; \t} empleado; } borrador [10]; 'struct – amiregelz

+0

y sindicales miembros de Anonymous son totalmente estándar C11, en realidad. – 00dani

0

Este error se debe a que está intentando acceder a los elementos de la estructura por el nombre de la propia estructura, lo que no es válido. Para acceder a los elementos de una estructura, primero debe crear un objeto para ella.

en el siguiente código manage y work son los objetos del gestor de estructuras y del worker respectivamente.

empleado de la unión { char key;

struct manager 
{ 
    short int age; 
    float shares; 
    short int level; 
}manage; 

struct worker 
{ 
    short int age; 
    short int skill; 
    short int department; 
}work; 

} empresa [10];

ahora para acceder al miembro u puede utilizar "empresa [i] .manage.age"

0

Puede acceder a los miembros, la forma en que está intentando (pero las estructuras que están dentro de la unión debe tener miembros únicos) pero debe asegurarse de que al compilar el código gcc debe saber que usted está tratando de esa manera,

comando: gcc -fms-extensions file_name.c que apoya a c11.

gustan:

union employee 
{ 
char key; 

struct manager 
{ 
    short int age; 
    float shares; 
    short int level; 
}; 

struct worker 
{ 
    short int age; 
    short int skill; 
    short int department; 
}; 
} company[10]; 

Básicamente, esto da error de compilación porque encuentra ambigüedad entre los miembros del gerente y el trabajador.

Así que si cambia el código para:

union employee 
{ 
char key; 

struct manager 
{ 
    short int age; 
    float shares; 
    short int level; 
}; 

struct worker 
{ 
    short int age1; 
    short int skill; 
    short int department; 
}; 

} company[10]; 

o de lo contrario se puede mantener directamente debajo de la unión.

a menos que no se especifica -fms-extensions al compilar dará errores de tiempo de compilación.

Cuestiones relacionadas