Programação D - Sindicatos
UMA unioné um tipo de dados especial disponível em D que permite armazenar diferentes tipos de dados no mesmo local da memória. Você pode definir uma união com muitos membros, mas apenas um membro pode conter um valor a qualquer momento. As uniões fornecem uma maneira eficiente de usar o mesmo local de memória para vários fins.
Definindo uma União em D
Para definir uma união, você deve usar a instrução união de maneira muito semelhante à que fez ao definir a estrutura. A declaração de união define um novo tipo de dados, com mais de um membro para seu programa. O formato da declaração sindical é o seguinte -
union [union tag] {
member definition;
member definition;
...
member definition;
} [one or more union variables];
o union tagé opcional e cada definição de membro é uma definição de variável normal, como int i; ou flutuar f; ou qualquer outra definição de variável válida. No final da definição da união, antes do ponto e vírgula final, você pode especificar uma ou mais variáveis de união, mas é opcional. Aqui está a maneira como você definiria um tipo de união denominado Data, que tem três membrosi, f, e str -
union Data {
int i;
float f;
char str[20];
} data;
Uma variável de Datatype pode armazenar um inteiro, um número de ponto flutuante ou uma string de caracteres. Isso significa que uma única variável (mesmo local de memória) pode ser usada para armazenar vários tipos de dados. Você pode usar qualquer tipo de dados integrado ou definido pelo usuário dentro de uma união com base em seus requisitos.
A memória ocupada por um sindicato será grande o suficiente para conter o maior membro do sindicato. Por exemplo, no exemplo acima, o tipo de dados ocupará 20 bytes de espaço de memória porque este é o espaço máximo que pode ser ocupado por uma sequência de caracteres. O exemplo a seguir exibe o tamanho total da memória ocupada pela união acima -
import std.stdio;
union Data {
int i;
float f;
char str[20];
};
int main( ) {
Data data;
writeln( "Memory size occupied by data : ", data.sizeof);
return 0;
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Memory size occupied by data : 20
Acessando Sócios Sindicais
Para acessar qualquer membro de um sindicato, usamos o member access operator (.). O operador de acesso de membro é codificado como um período entre o nome da variável de união e o membro de união que desejamos acessar. Você usaria a palavra-chave união para definir variáveis do tipo união.
Exemplo
O exemplo a seguir explica o uso de união -
import std.stdio;
union Data {
int i;
float f;
char str[13];
};
void main( ) {
Data data;
data.i = 10;
data.f = 220.5;
data.str = "D Programming".dup;
writeln( "size of : ", data.sizeof);
writeln( "data.i : ", data.i);
writeln( "data.f : ", data.f);
writeln( "data.str : ", data.str);
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
size of : 16
data.i : 1917853764
data.f : 4.12236e+30
data.str : D Programming
Aqui, você pode ver que os valores de i e f membros da união foram corrompidos porque o valor final atribuído à variável ocupou a localização da memória e esta é a razão que o valor de str membro está sendo impresso muito bem.
Agora vamos olhar para o mesmo exemplo mais uma vez, onde usaremos uma variável de cada vez, que é o objetivo principal de ter união -
Exemplo Modificado
import std.stdio;
union Data {
int i;
float f;
char str[13];
};
void main( ) {
Data data;
writeln( "size of : ", data.sizeof);
data.i = 10;
writeln( "data.i : ", data.i);
data.f = 220.5;
writeln( "data.f : ", data.f);
data.str = "D Programming".dup;
writeln( "data.str : ", data.str);
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
size of : 16
data.i : 10
data.f : 220.5
data.str : D Programming
Aqui, todos os membros estão sendo impressos muito bem porque um membro está sendo usado por vez.