Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   ¿ union ? (https://www.clubdelphi.com/foros/showthread.php?t=53813)

Guillermo80 01-03-2008 19:06:40

¿ union ?
 
Hola foreros, en mi ardua tarea de seguir traduciendo unos headers me he encontrado con la siguiente declaración de un registro:


Código PHP:

typedef struct {
              
unsigned blocksize;
                  
unsigned sample_rate;
                  
unsigned channels;
                  
FLAC__ChannelAssignment channel_assignment;
               
unsigned bits_per_sample;
               
FLAC__FrameNumberType number_type;
               
union {
                          
FLAC__uint32 frame_number;
                          
FLAC__uint64 sample_number;
              } 
number;
               
FLAC__uint8 crc;
  } 
FLAC__FrameHeader

De aquí sólo me interesa que me digáis qué significa eso de union, nunca me lo había encontrado y la verdad, no sé que quere decir.:confused:

ucanneo 01-03-2008 21:22:42

Bueno, eso de union es como decir que el mismo sitio vas a guardar todo nada mas que cada uno ocupará lo que tenga que ocupar:


con struct:
|*****************| <--- Espacio total
|Var1, V a r i a b l e 2| <--- Organizacion interna


con union:
|*************| <----- supongamos que es el espacio que tienes
|Var1 | <----- este es el que ocupa la vriable 1
|V a r i a b le 2 | <------ pero resulta que en el mismo espacio inicia la
variable 2 y ocupa más espacio

Esto se usa por lo general cuando no sabes que tamaño vas a usar y no quieres desperdiciar memoria, o cuando deseas hacer las cosas más eficientes, o para lo que sea que desees hacer y se te ocurra que se adapte a este concepto

para mayor referencia:
http://209.85.207.104/search?q=cache:Qep_AkP2nBEJ:www.conclase.net/c/curso/index.php%3Fcap%3D016+palabra+reservada+union+c%2B%2B&hl=es&ct=clnk&cd=2&gl=mx


saludos

AzidRain 01-03-2008 21:34:21

union es un tipo de datos de C muy similar a struct. La definición "canónica" union es:
Cita:

Las uniones son estructuras de datos que permiten que una misma porción de memoria se accedida por un número diferente de tipos de datos, debido a que de hecho todos ellos se encuentran en la misma ubicación de memoria. Su declaración y uso es similar al de struct pero su funcionalidad es totalmente diferente
Aqui tienes un ejemplo:

Todos los elementos de una union ocupan el mismo espacio físico en memoria, de manera que el espacio total que ocupa la union es el del elemento de mayor tamaño:
Código:

union mytypes_t {
  char c;
  int i;
  float f;
  } mytypes;

define tres elementos:
Código:

mytypes.c
mytypes.i
mytypes.f

cada uno con diferente tipo de datos. Debido a que todos se refieren a la misma ubicación en memoria, la modificación de uno de los elementos afectará el valor de todos. No podemos almacenar valores independientes en cada elemento.

Por eso se llama union, si cambias un campo cambias el otro en automático

Guillermo80 01-03-2008 22:17:03

union
 
Gracias a los dos por vuestras explicaciones. Sin duda es la definición perfecta para lo que significan esas dos variables definidas en el registro union. Lo único que veo "feo" es definir dentro del struct el union, en vez de definirlo aparte y luego simplemente invocar al union asignándole un nombre.

Cita:

union {
FLAC__uint32 frame_number;
FLAC__uint64 sample_number;
}
number;



typedef struct {
unsigned blocksize;
unsigned sample_rate;
unsigned channels;
FLAC__ChannelAssignment channel_assignment;
unsigned bits_per_sample;
FLAC__FrameNumberType number_type;
number miNumber;
FLAC__uint8 crc;
}
FLAC__FrameHeader;

¿Qué os parece así?
Lo digo porque tal y como está definido, para acceder a frame_number de la primera forma tendría que "presuponer" que el nombre con el que se invoca a union es "number", o sea:

Cita:

miFLAC__FrameHeader.number.frame_number


Mientras que de la forma que propongo veo más claro acceder así:

Cita:

miFLAC__FrameHeader.miNumber.frame_number
Espero no haberos hecho un lío con los nombres ;). Por cierto, gracias de nuevo, da sentido totalmente a lo que teóricamente significan esas variables, ya que necesito que cuando una cambie de valor, automáticamente la otra también lo haga. La faena va a ser encontrar su "análogo" en Delphi, ¿tenéis algún as más en la manga?

escafandra 01-03-2008 22:41:57

Cuando la definición de un tipo la haces dentro de una estructura o clase, es porque consideras que es propio de esa estructura o clase. Generalmente sólo la vas a utilizar desde ella. El mismo nombre puede ser utilizado en otro ámbito para definir un tipo totalmente distinto. Los motivos, de este tipo de declaraciones, no son de sintaxis sino mas bien de "encapsulamiento" en esa estructura. Si ese tipo va a ser de uso general, entonces puede ser mas coherente definirlo como independiente.

No se mucho de delphi, por lo que no te puedo ayudar en la conversión de union. Ni siquiera se si existe en delphi.

Saludos.

Guillermo80 01-03-2008 23:44:43

Bueno Escafandra, puedo estar de acuerdo con lo que dices, aunque reitero mi duda. Suponiendo ese caso inicial que propuse, con el encapsulamiento de union dentro de struct, yo preguntaba finalmente cómo acceder a alguno de sus campos (ya que nunca me he encontrado con nada similar, siempre lo hacía con alguna variable definida para el tipo/registro que fuese), y proponía el siguiente acceso y más obvio (para acceder a frame_number):

Cita:

miFLAC__FrameHeader.number.frame_number
..suponiendo que number además de ser el nombre del registro union a su vez sirva para acceder a sus propios campos. Me gustaría saber si esta sentencia contiene algún error o está bien.

Gracias de nuevo a todos por vuestro interés.

escafandra 02-03-2008 00:08:11

Claro, esa es la forma de acceder a los elementos de esa union

Código:

miFLAC__FrameHeader.number.frame_number
miFLAC__FrameHeader.number.sample_number

Saludos.


La franja horaria es GMT +2. Ahora son las 10:55:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi