TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: cucu en 31 de Octubre de 2008, 05:48:48

Título: definición de estructuras y uniones
Publicado por: cucu 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.
Título: Re: definición de estructuras y uniones
Publicado por: DarkVect 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!!
Título: Re: definición de estructuras y uniones
Publicado por: cucu 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
Título: Re: definición de estructuras y uniones
Publicado por: DarkVect 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.
Título: Re: definición de estructuras y uniones
Publicado por: cucu 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
Título: Re: definición de estructuras y uniones
Publicado por: DarkVect 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;

¿?
Título: Re: definición de estructuras y uniones
Publicado por: MGLSOFT 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...
Título: Re: definición de estructuras y uniones
Publicado por: RedPic en 31 de Octubre de 2008, 23:19:14
¿Qué C es éste? Porque el CCS C no permite estas estructuras de bits. Creo.
Título: Re: definición de estructuras y uniones
Publicado por: MGLSOFT en 31 de Octubre de 2008, 23:25:29
Si miras con detenimiento la libreria original del LCD, veras que si. :mrgreen:
Título: Re: definición de estructuras y uniones
Publicado por: Nocturno en 01 de Noviembre de 2008, 05:55:12
Efectivamente, eso funciona perfectamente en CCS.
Título: Re: definición de estructuras y uniones
Publicado por: gera 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!!!
Título: Re: definición de estructuras y uniones
Publicado por: cucu 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.
Título: Re: definición de estructuras y uniones
Publicado por: cucu 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
Título: Re: definición de estructuras y uniones
Publicado por: RICHI777 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 !