Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-03-2008
Avatar de Guillermo80
Guillermo80 Guillermo80 is offline
Miembro
 
Registrado: may 2007
Posts: 87
Poder: 17
Guillermo80 Va por buen camino
¿ 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.
Responder Con Cita
  #2  
Antiguo 01-03-2008
ucanneo ucanneo is offline
Miembro
 
Registrado: feb 2008
Posts: 30
Poder: 0
ucanneo Va por buen camino
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

Última edición por ucanneo fecha: 01-03-2008 a las 21:25:40.
Responder Con Cita
  #3  
Antiguo 01-03-2008
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
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
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #4  
Antiguo 01-03-2008
Avatar de Guillermo80
Guillermo80 Guillermo80 is offline
Miembro
 
Registrado: may 2007
Posts: 87
Poder: 17
Guillermo80 Va por buen camino
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?
Responder Con Cita
  #5  
Antiguo 01-03-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #6  
Antiguo 01-03-2008
Avatar de Guillermo80
Guillermo80 Guillermo80 is offline
Miembro
 
Registrado: may 2007
Posts: 87
Poder: 17
Guillermo80 Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 02-03-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con UNION Alexander Conexión con bases de datos 2 05-07-2006 06:11:51
Problema Con Union All poniente SQL 4 29-05-2006 19:18:31
Select de un Union All?? Luana Tablas planas 1 17-04-2006 16:24:07
Union en BDE eduarcol SQL 9 05-07-2004 18:49:10


La franja horaria es GMT +2. Ahora son las 01:08:58.


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
Copyright 1996-2007 Club Delphi