C/Visual C - Que realmente es una union?

 
Vista:

Que realmente es una union?

Publicado por Oliver Ramirez (339 intervenciones) el 23/04/2002 01:40:53
quisiera un ejemplo pràctico donde yo podria utilizar una union en vez de una extructura?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Que realmente es una union?

Publicado por Alexis Leung Cheung (70 intervenciones) el 24/04/2002 19:49:45
Oliver, una union es casi lo mismo que una estructura con la diferencia de que la union siempre va a ocupar menos que una estructura. ¿Porque?, debido a que la cantidad de bytes que ocupa equivale a la suma de todas las variables, en cambio la union, la cantidad de bytes que ocupa equivale a la variable más grande. He aqui un ejemplo:

struct dato {
char var1[2]; /* 2 BYTES */
int numero; /* 2 BYTES */
}
CANTIDAD DE BYTES QUE OCUPA: 2 + 2 = 4

union dato {
char var1[2]; /* 2 BYTES */
int numero; /* 2 BYTES */
}
CANTIDAD QUE OCUPA: 2 BYTES

La diferencia está en que en la union, el entero "numero" comparte con el arreglo "var1" los 2 bytes. Y entonces si hago esto

dato.numero = 256;

var1 se modifica pues también estamos modificandolo a traves de "numero". Entonces var1 valdría:

var1[0] = 16;
var1[1] = 16;

Pruebalo con un programa que imprima esto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Que realmente es una union?

Publicado por Alexis Leung Cheung (70 intervenciones) el 24/04/2002 19:50:16
Oliver, una union es casi lo mismo que una estructura con la diferencia de que la union siempre va a ocupar menos que una estructura. ¿Porque?, debido a que la cantidad de bytes que ocupa equivale a la suma de todas las variables, en cambio la union, la cantidad de bytes que ocupa equivale a la variable más grande. He aqui un ejemplo:

struct dato {
char var1[2]; /* 2 BYTES */
int numero; /* 2 BYTES */
}
CANTIDAD DE BYTES QUE OCUPA: 2 + 2 = 4

union dato {
char var1[2]; /* 2 BYTES */
int numero; /* 2 BYTES */
}
CANTIDAD QUE OCUPA: 2 BYTES

La diferencia está en que en la union, el entero "numero" comparte con el arreglo "var1" los 2 bytes. Y entonces si hago esto

dato.numero = 256;

var1 se modifica pues también estamos modificandolo a traves de "numero". Entonces var1 valdría:

var1[0] = 16;
var1[1] = 16;

Pruebalo con un programa que imprima esto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Que realmente es una union?

Publicado por chuidiang (677 intervenciones) el 28/04/2002 17:22:46
Imagina que en una estructura quieres guardar datos de deportistas (nombre, apellidos, deporte y mejor marca). Resulta que la mejor marca será una cosa distinta en función del deporte (número de goles en un solo partido, tiempo en realizar una carrera, canastas en un partido, etc, etc). Este último campo, sobre todo si fueran tipos distintos (unos int, otros float, otros char[]) sería ideal para hacer con una unión:

struct deportista
{
char nombre[20];
char apellidos[20];
char deporte [20];
union marca
{
float mejor_tiempo;
int numero_goles;
int numero_canastas;
}
};

De los tres últimos campos, sólo uno tiene sentido en cada deportista. Los tres campos ocupan la misma zona de memoria y lo leerías correctamente como
deportista.marca.mejor_tiempo o
deportista.marca.numero_goles.

Es asunto tuyo recordar en cada variable deportista, cómo guardaste la marca para leerla luego correctamente (recuerda, son tipos distintos). Te dará resultados inesperador escribir deportista.marca.numero_goles = 10 y luego tratar de leer, en la misma variable deportista.marca.mejor_tiempo.

No es necesario que todos los campos de la unión tengan el mimo tamaño. El compilador siempre reservará hueco para el más grande de ellos.

En resumen, que si en una estructura o variable el tipo debe ser distinto en función de alguna otra cosa que tengas (por ejemplo, tipo de deporte), puedes usar una union para tener todas las posibilidades ocupando un mínimo de memoria.

Se bueno
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar