elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C++] Qué son las estructuras union y enum?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C++] Qué son las estructuras union y enum?  (Leído 972 veces)
huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
[C++] Qué son las estructuras union y enum?
« en: 10 Noviembre 2018, 02:11 am »

Pues no he encontrado mucha info acerca de ambas estructuras de datos, que alguien me las explique que son y cómo usarlas.
Saludos


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.492



Ver Perfil
Re: [C++] Qué son las estructuras union y enum?
« Respuesta #1 en: 10 Noviembre 2018, 13:18 pm »

ENUM: sirve para crear constantes bajo un nombre que las agrupe. Por defecto el primer elemento de la enumeración vale 0. Las siguientes irán sumándose una unidad.

Código
  1. #include <stdio.h>
  2.  
  3. enum dia {
  4.    LUNES,
  5.    MARTES,
  6.    MIERCOLES,
  7.    JUEVES,
  8.    VIERNES,
  9.    SABADO,
  10.    DOMINGO
  11. };
  12.  
  13. int main() {
  14.    enum dia entrada = LUNES;
  15.  
  16.    printf("%d", entrada);
  17. }
  18.  

Prueba este código cambiando LUNES, dentro de main, por otro de los días.
Se puede cambiar el valor de la constante indicándole el nuevo que puede tener, por ejemplo MIERCOLES = 20 dentro de la enumeración. En ese momento MARTES valdrá 1, MIERCOES 20, JUEVES 21, pues sigue la regla de que el siguiente identificador vale uno más que el anterior.

Hay que diferenciar que una enumeración en C es una simple constante mientras que en C++ es un tipo de dato, con las restricciones que esto supone.



UNION:
Las uniones sirven para dar a una misma posición de memoria diferentes nombres y comportamientos. Es decir en la misma posición de memoria puede empezar un int, un char, un double, un array de 8 floats, una estructura, etc. El tamaño intrínseco de la unión es el mismo que la del dato que ocupa más tamaño, por ejemplo si una unión está constituida como te he explicado antes y el array de 8 floats es quien ocupa más, el tamaño de toda la unión ocupará lo mismo que el array de 8 floats.
Ahora la unión no tiene mucha utilidad, pero antes cuándo los ordenadores no tenían mucha memoria esta era una buena forma de reutilzar la memoria teniendo diferentes identificadores que se usaban en diferentes momentos pero sin ocupar más.

Un ejemplo de su uso:
Código
  1. #include <stdio.h>
  2.  
  3. union var {
  4.    int entero;
  5.    double real;
  6.    char caracter;
  7. };
  8.  
  9. int main() {
  10.    union var mi_dato;
  11.  
  12.    puts("Caracteristicas de mi_dato:");
  13.    printf("Direccion de inicio: %p\n", &mi_dato);
  14.    printf("Tamanyo: %I64d\n\n", sizeof(mi_dato));
  15.  
  16.    // USOS
  17.    mi_dato.entero = 5;
  18.    printf("%d\n", mi_dato.entero);
  19.  
  20.    // ...
  21.  
  22.    mi_dato.real = 14.54;
  23.    printf("%f\n", mi_dato.real);
  24.  
  25.    // ...
  26.  
  27.    mi_dato.caracter = 'c';
  28.    printf("%c\n", mi_dato.caracter);
  29. }

Una forma de usar una unión en estos días podría ser la siguiente:
Código
  1. #include <stdio.h>
  2.  
  3. union por_partes {
  4.    int entero;
  5.    unsigned char trozo[sizeof(int)];
  6. };
  7.  
  8. int main() {
  9.    union por_partes mi_numero;
  10.  
  11.    mi_numero.entero = 4789432;
  12.  
  13.    // Simula enviar por bytes un dato
  14.    puts("Dato a enviar: ");
  15.    printf("%X\n\n", mi_numero.entero);
  16.  
  17.    puts("Enviando byte a byte:");
  18.    for(int i = 0; i < sizeof(mi_numero); ++i) {
  19.        printf("%X\n", mi_numero.trozo[i]);
  20.    }
  21. }

Este programa es dependiente al endiandness de la máquina, pero eso ya es harina de otro costanl


« Última modificación: 10 Noviembre 2018, 13:31 pm por MAFUS » En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
Re: [C++] Qué son las estructuras union y enum?
« Respuesta #2 en: 10 Noviembre 2018, 15:24 pm »

Muchas gracias por la explicación.
Con respecto al último ejemplo, absolutamente casi todas las maquinas son little endian. Si mal no recuerdo, los antiguos
procesadores Motorola eran big endian (y aun lo siguen siendo).
Saludos.  :)
En línea

elgilun

Desconectado Desconectado

Mensajes: 17



Ver Perfil
Re: [C++] Qué son las estructuras union y enum?
« Respuesta #3 en: 10 Noviembre 2018, 17:04 pm »

Ya que en la pregunta está especificado que se trata de C++, conviene decir que hay diferencias importantes entre C y C++.

Una union en C++ siempre tiene un miembro activo, que es el último que se ha escrito, y tratar de leer un miembro que no sea el activo está calificado como "UB" (undefined behavior). Puede ser que algún compilador en particular lo implemente como una extensión al lenguaje, pero eso ya es otro cuento.

En el ejemplo:

Código:
#include <cstdio>

union por_partes {
    int entero;
    unsigned char trozo[sizeof(int)];
};

int main()
{
    por_partes mi_numero;

    mi_numero.entero = 4789432;  // el miembro activo es "entero"

    // puede ser que algún compilador lo acepte como una
    // extención al lenguaje, pero para el C++
    // tratar de leer un miembro que no sea el activo es
    // UB - "undefined behavior"
    printf("%X\n", mi_numero.trozo[0]);  // UNDEFINED BEHAVIOR

    mi_numero.trozo[0] = 128;
    // ahora el miembro activo es "trozo", y pretender leer
    // "entero" sería otra vez UB.

}

Otra diferencia importante es que el C++ permite funciones miembro de una union, incluidos constructores y un destructor.

También, una union puede tener miembros que sean clases, con o sin constructores o destructores definidos por el usuario, en ese caso habrá que instanciar al miembro activo usando placement new e invocar a su destructor antes de cambiar de miembro activo.

Otra diferencia importante es la forma de inicialización. En C se puede hacer
Código:
por_partes un_numero = {.numero=128};
pero hay que esperar al C++20 para hacer lo mismo en C++.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.492



Ver Perfil
Re: [C++] Qué son las estructuras union y enum?
« Respuesta #4 en: 10 Noviembre 2018, 22:20 pm »

El comportamiento es el mismo. Si en C has designado un valor a un doble y lo vayas a leer desde un entero, por ejemplo, el valor que se conseguirá será muy extraño.
De igual forma si uno de los miembros es un puntero asignado con malloc y se hace una asignación a un char sin haber liberado la memoria con free, esa memoria continuará capturada pero sin referencia para liberarla.
En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
elgilun

Desconectado Desconectado

Mensajes: 17



Ver Perfil
Re: [C++] Qué son las estructuras union y enum?
« Respuesta #5 en: 11 Noviembre 2018, 00:40 am »

Hola MAFUS;

Una de la diferencias que señalo en mi respuesta anterior se refiere al comportamiento frente a la
lectura de un miembro de la union que no haya sido el más recientemente escrito.

Mientras que para el C es de comportamiento definido por la implementación ("implementation defined"), para el C++ es de comportamiento indefinido ("undefined behavior").

Esto es, para el caso del C, es una cuestión práctica; para el caso del C++ es una cuestión moral:

  • En C puedes hacerlo, el lenguaje no lo prohíbe, sólo que el resultado dependerá del compilador (simplemente no es portable).
  • En C++ no debes hacerlo, el lenguaje lo prohíbe, el resultado es indefinido, puede suceder cualquier cosa, casi siempre mala.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda con Enum
Programación Visual Basic
SheKeL_C$ 1 1,324 Último mensaje 19 Diciembre 2008, 01:10 am
por seba123neo
[error] costantes enum en c++
Programación C/C++
dani__ 7 4,283 Último mensaje 22 Junio 2010, 14:25 pm
por [L]ord [R]NA
Algoritmos quick union y wighted quick union?
Programación General
carlmycol 1 1,139 Último mensaje 11 Septiembre 2014, 18:05 pm
por rir3760
Estructuras dentro de Estructuras (Visual Basic 2013)
.NET (C#, VB.NET, ASP)
Tazmania40 0 871 Último mensaje 3 Marzo 2017, 21:44 pm
por Tazmania40
Enum
Programación C/C++
angeljonh 3 1,107 Último mensaje 21 Agosto 2017, 20:10 pm
por angeljonh
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines