varias thirlwall superponer studio ley jade graficos graficas europea europa copyright c unions

thirlwall - superponer graficas en r



¿Cómo verificar qué tipo se usa actualmente en unión? (5)

¿Hay alguna solución mejor?

No, la solución que mostró es la mejor (y la única). union son bastante simplistas: no "rastrean" lo que asignó a qué. Todo lo que hacen es permitirle reutilizar el mismo rango de memoria para todos sus miembros. No proporcionan nada más que eso, por lo que encerrarlos en una struct y usar un campo de "tipo" para realizar el seguimiento es precisamente lo correcto.

digamos que tenemos un sindicato

typedef union someunion { int a; double b; } myunion;

¿Es posible verificar qué tipo está en unión después de configurar, por ejemplo, a = 123? Mi enfoque es agregar esta unión a alguna estructura y establecer uniontype en 1 cuando es int y 2 cuando es doble.

typedef struct somestruct { int uniontype myunion numbers; } mystruct;

¿Hay alguna solución mejor?


C no realiza un seguimiento automático de qué campo de una unión está actualmente en uso. (De hecho, creo que la lectura del campo "incorrecto" se traduce en un comportamiento definido por la implementación). Como tal, depende de su código hacer un seguimiento de cuál se está usando / completando actualmente.

Su enfoque para mantener una variable separada ''tipo de unión'' es un enfoque muy común para esto, y debería funcionar bien.


Dependiendo de la aplicación, si se trata de un objeto de corta duración, puede codificar el tipo en el flujo de control, es decir. tener bloques / funciones separadas para ambos casos

struct value { const char *name; myunion u; }; void throwBall(Ball* ball) { ... struct value v; v.name = "Ball"; v.u.b = 1.2; process_value_double(&v); //double struct value v2; v2.name = "Age"; v2.u.a = 19; check_if_can_drive(&v2); //int ... } void countOranges() { struct value v; v.name = "counter"; v.u.a = ORANGE; count_objects(&v); //int }


No hay forma de consultar directamente el tipo almacenado actualmente en una union .

Las únicas formas de saber el tipo almacenado en una union son tener una mystruct explícita (como en su ejemplo de mystruct ), o para garantizar que el control solo fluya a ciertas partes del código cuando la unión tiene un elemento activo conocido.


Advertencia: lo siguiente es solo para fines de aprendizaje:

Puede usar algunos trucos feos para hacerlo (siempre y cuando los tipos de datos en su unión tengan diferentes tamaños, que es el caso presente):

#include <stdio.h> typedef union someunion { int a; double b; } myunion; typedef struct somestruct { int uniontype; myunion numbers; } mystruct; #define UPDATE_CONTENT(container, value) if ( / ((sizeof(value) == sizeof(double)) / ? (container.uniontype = ((container.numbers.b = value), 2)) / : (container.uniontype = ((container.numbers.a = value), 1)))) int main() { mystruct my_container; UPDATE_CONTENT(my_container, 42); printf("%d/n", my_container.uniontype); UPDATE_CONTENT(my_container, 37.1); printf("%d/n", my_container.uniontype); return (0); }

Pero te aconsejo que nunca hagas esto.