Autor Tema: definición de estructuras y uniones  (Leído 3332 veces)

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

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
definición de estructuras y uniones
« en: 31 de Octubre de 2008, 05:48:48 »
hola, no entiendo bien la diferencia entre una "struct" y una "union", normalmente, estas dos se encuentran en las librerías, por ejemplo, tengo:


typedef struct _LONG_ADDR
{
    BYTE v[8];
} LONG_ADDR;

       ¿esto sería un array de 8 bytes?

typedef union _SHORT_ADDR
{
    struct _SHORT_ADDR_bits
    {
        BYTE LSB;
        BYTE MSB;
    } byte;
    WORD Val;
    BYTE v[2];
} SHORT_ADDR;

     ¿esto serían dos bytes? ¿porque pone luego WORD val y BYTE[2]?


typedef union _GTS_HEADER
{
    BYTE Val;
    struct _GTS_HEADER_bits
    {
        unsigned int GTSDescriptorCount :3;
        unsigned int :4;
        unsigned int GTSPermit :1;
    } bits;
} GTS_HEADER;

     Este ni idea de que quiere decir, no entiendo nada desde el principio.


¿cómo se usan luego estas variables? Gracias.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: definición de estructuras y uniones
« Respuesta #1 en: 31 de Octubre de 2008, 06:36:40 »
La diferencia es significativa.

En un struct todo lo que declaras dentro tiene su espacio mapeado en memoria de forma que cada porción se corresponde con el tipo de dato que has declarado. Por ejemplo:

typedef struct
{
    int numero;
    char letra;
} tecla;

Tienes "una posición" de memoria que es un int y otra que es un char.

En una unión sólo se reserva espacio para la mayor de las variables delcaradas y el resto se "guardan dentro" de ese espacio. Por ejemplo;

typedef union
{
    int numero;
    char letra;
} tecla;

En este caso NO tienes dos variables, una int y otra char, sino un espacio del tamaño int donde puedes guardar un int o un char.

En el primer caso puedes hacer:

tecla_pulsada.numero=1;
tecla_pulsada.letra='c';

y ambas guardan el valor seteado.

En el segundo caso si haces lo mismo, la letra machaca el número porque se guardan en el mismo espacio de memoria. Una union sirve para guardar variables que pueden ser de más de un tipo. OJO!! porque siempre que la leas tienes que saber de qué forma fue guardada para leerla como int o como char, en este caso.

Saludos!!

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
Re: definición de estructuras y uniones
« Respuesta #2 en: 31 de Octubre de 2008, 07:13:37 »
muchas gracias, a ver si te he entendido, en tu ejemplo, en el caso de la unión, si hago:

tecla_pulsada.numero = 0x1234;
tecla_pulsada.letra = 0x56; //suponiendo código ascii

si luego me equivoco y llamo a tecla_pulsada como un int, ¿obtendría 0x1256?

otra cosa ¿lo de BYTE v[8]? ¿es definición de un array de 8 posiciones de tamaño byte?


Saludos

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: definición de estructuras y uniones
« Respuesta #3 en: 31 de Octubre de 2008, 07:21:31 »
Depende de cómo el sistema guarde los datos en memoria (no se si tu SO lo guarda en big-endian o no) pero la idea es esa.  Tal y como lo has puesto, si llamas al valor con tecla_pulsada.letra obtendrás el valor correcto, si lo haces como int obtendrás "basura". Es muy recomendable hacer las lecturas siempre con el valor que toca, aunque sepas los bits que ocupa cada cosa en memoria y seas capaz de hacer la lectura con otro formato.

Lo de Byte v[8] sí, es un vector de 8 bytes.

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
Re: definición de estructuras y uniones
« Respuesta #4 en: 31 de Octubre de 2008, 10:10:47 »
Gracias, realmente útil eso que me dices, lo que sigo sin entender es:

    struct _GTS_HEADER_bits
    {
        unsigned int GTSDescriptorCount :3;
        unsigned int :4;
        unsigned int GTSPermit :1;
    } bits;

según entiendo, los tres primeros bits del "unsigned int" se llaman GTSDescriptorCount, los cuatro siguientes no tienen nombre, con lo que no se usan, y el siguiente se llama GTSPermit, ¿es así?

Si el funcionamiento es el que yo creo, ¿que sentido tiene reservar un int para algo que ocupa 8 bits? ¿no sería mejor un char?

Saludos

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: definición de estructuras y uniones
« Respuesta #5 en: 31 de Octubre de 2008, 16:14:44 »
LO siento pero es que jamás había visto esto en C:

unsigned int :4;

¿?

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: definición de estructuras y uniones
« Respuesta #6 en: 31 de Octubre de 2008, 22:50:14 »
Gracias, realmente útil eso que me dices, lo que sigo sin entender es:

    struct _GTS_HEADER_bits
    {
        unsigned int GTSDescriptorCount :3;
        unsigned int :4;
        unsigned int GTSPermit :1;
    } bits;

según entiendo, los tres primeros bits del "unsigned int" se llaman GTSDescriptorCount, los cuatro siguientes no tienen nombre, con lo que no se usan, y el siguiente se llama GTSPermit, ¿es así?

Si el funcionamiento es el que yo creo, ¿que sentido tiene reservar un int para algo que ocupa 8 bits? ¿no sería mejor un char?

Saludos

Me corregiran mis compañeros si me equivoco.
 :mrgreen:
    struct _GTS_HEADER_bits
    {
        unsigned int GTSDescriptorCount :3;
        unsigned int :4;
        unsigned int GTSPermit :1;
    } bits;

GTSDescriptorCount usa los tres primeros bits del "unsigned int" , los cuatro siguientes se reservan sin asignar, con lo que no se usan, y el siguiente se llama GTSPermit.
Todo el conjunto entra en una estructura llamada bits...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: definición de estructuras y uniones
« Respuesta #7 en: 31 de Octubre de 2008, 23:19:14 »
¿Qué C es éste? Porque el CCS C no permite estas estructuras de bits. Creo.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: definición de estructuras y uniones
« Respuesta #8 en: 31 de Octubre de 2008, 23:25:29 »
Si miras con detenimiento la libreria original del LCD, veras que si. :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: definición de estructuras y uniones
« Respuesta #9 en: 01 de Noviembre de 2008, 05:55:12 »
Efectivamente, eso funciona perfectamente en CCS.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: definición de estructuras y uniones
« Respuesta #10 en: 01 de Noviembre de 2008, 22:48:45 »
tal cual, funciona en CCS, y se usa mucho para flags y cosas asi, de este modo economizamos memoria.
saludos!!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
Re: definición de estructuras y uniones
« Respuesta #11 en: 03 de Noviembre de 2008, 05:46:36 »
RedPic, esto es C18, pero vamos, que supongo que ya da igual.

Sigo con una duda, ya veo lo que significa la estructura GTS_HEADER, pero, si ocupa 8 bits en total (3+4+1) ¿qué sentido tiene utilizar un int? ¿eso no desperdicia memoria?ç

Gracias de nuevo.

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
Re: definición de estructuras y uniones
« Respuesta #12 en: 10 de Noviembre de 2008, 07:17:07 »
Hola, quería saber si me podeis ayudar con un tipo de datos parecido, es el "enum", la forma de definirlo es la siguiente:

typedef enum _ROUTE_STATUS
{
    ROUTE_ACTIVE                    = 0x00,
    ROUTE_DISCOVERY_UNDERWAY        = 0x01,
    ROUTE_DISCOVERY_FAILED          = 0x02,
    ROUTE_INACTIVE                  = 0x03
} ROUTE_STATUS;

El caso es que luego quiero comparar si mi variable es igual al caso ROUTE_DISCOVERY_FAILED, osea, 0x02, pero, ¿como se el tipo de datos que es para compararla? ¿la forma sería la siguiente?

if (variable == ROUTE_STATUS.ROUTE_DISCOVERY_FAILED)

el compilador me dice que no está definida esa variable.

Gracias

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: definición de estructuras y uniones
« Respuesta #13 en: 10 de Noviembre de 2008, 11:05:58 »
Hola en primer lugar variable debe ser del tipo ROUTE_STATUS y despues usar directamente el valor del enumerado, algo asi:

Código: C
  1. ROUTE_STATUS variable;
  2. ....
  3.  
  4. if ( variable == ROUTE_DISCOVERY_FAILED )
  5. .....

Saludos !