Programowanie D - Związki
ZA unionto specjalny typ danych dostępny w D, który umożliwia przechowywanie różnych typów danych w tej samej lokalizacji pamięci. Możesz zdefiniować unię z wieloma członkami, ale tylko jeden członek może zawierać wartość w danym momencie. Związki zapewniają efektywny sposób używania tej samej lokalizacji pamięci do wielu celów.
Definiowanie unii w D.
Aby zdefiniować sumę, musisz użyć instrukcji union w bardzo podobny sposób, jak podczas definiowania struktury. Instrukcja union definiuje nowy typ danych z więcej niż jednym składnikiem programu. Format oświadczenia związku jest następujący -
union [union tag] {
member definition;
member definition;
...
member definition;
} [one or more union variables];
Plik union tagjest opcjonalna, a każda definicja elementu jest normalną definicją zmiennej, taką jak int i; lub float f; lub inną prawidłową definicję zmiennej. Na końcu definicji unii, przed ostatnim średnikiem, można określić jedną lub więcej zmiennych sumujących, ale jest to opcjonalne. Oto sposób zdefiniowania typu unii o nazwie Dane, który ma trzech członkówi, f, i str -
union Data {
int i;
float f;
char str[20];
} data;
Zmienna Datatype może przechowywać liczbę całkowitą, liczbę zmiennoprzecinkową lub ciąg znaków. Oznacza to, że jedna zmienna (ta sama lokalizacja pamięci) może być używana do przechowywania wielu typów danych. W ramach unii można używać dowolnych wbudowanych lub zdefiniowanych przez użytkownika typów danych w zależności od wymagań.
Pamięć zajmowana przez związek będzie wystarczająco duża, aby pomieścić największego członka związku. Na przykład w powyższym przykładzie Typ danych zajmie 20 bajtów pamięci, ponieważ jest to maksymalna przestrzeń, jaką może zajmować ciąg znaków. Poniższy przykład wyświetla całkowity rozmiar pamięci zajmowanej przez powyższą sumę -
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;
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Memory size occupied by data : 20
Dostęp do członków związku
Aby uzyskać dostęp do dowolnego członka związku, używamy rozszerzenia member access operator (.). Operator dostępu do członka jest zakodowany jako kropka między nazwą zmiennej unii a członkiem związku, do którego chcemy uzyskać dostęp. Aby zdefiniować zmienne typu union, należy użyć słowa kluczowego union.
Przykład
Poniższy przykład wyjaśnia użycie union -
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);
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
size of : 16
data.i : 1917853764
data.f : 4.12236e+30
data.str : D Programming
Tutaj możesz zobaczyć, że wartości i i f członkowie związku ulegli uszkodzeniu, ponieważ ostateczna wartość przypisana do zmiennej zajęła miejsce w pamięci i to jest powód, dla którego wartość str członek jest bardzo dobrze drukowany.
Spójrzmy teraz jeszcze raz na ten sam przykład, w którym będziemy używać jednej zmiennej naraz, co jest głównym celem utworzenia unii -
Zmodyfikowany przykład
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);
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
size of : 16
data.i : 10
data.f : 220.5
data.str : D Programming
Tutaj wszyscy członkowie są bardzo dobrze drukowani, ponieważ jeden członek jest używany na raz.