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.