Programmazione D - Unioni

UN unionè un tipo di dati speciale disponibile in D che consente di memorizzare diversi tipi di dati nella stessa posizione di memoria. È possibile definire un'unione con molti membri, ma solo un membro può contenere un valore in un dato momento. Le unioni forniscono un modo efficiente di utilizzare la stessa posizione di memoria per più scopi.

Definizione di un'unione in D

Per definire un'unione, è necessario utilizzare l'istruzione union in modo molto simile a come hai fatto durante la definizione della struttura. L'istruzione union definisce un nuovo tipo di dati, con più di un membro per il programma. Il formato della dichiarazione sindacale è il seguente:

union [union tag] { 
   member definition; 
   member definition; 
   ... 
   member definition; 
} [one or more union variables];

Il union tagè opzionale e ogni definizione di membro è una normale definizione di variabile, come int i; o float f; o qualsiasi altra definizione di variabile valida. Alla fine della definizione dell'unione, prima del punto e virgola finale, puoi specificare una o più variabili di unione ma è opzionale. Ecco il modo in cui definiresti un tipo di unione denominato Data che ha i tre membrii, f, e str -

union Data { 
   int i; 
   float f; 
   char str[20]; 
} data;

Una variabile di Datatype può memorizzare un numero intero, un numero a virgola mobile o una stringa di caratteri. Ciò significa che una singola variabile (stessa posizione di memoria) può essere utilizzata per memorizzare più tipi di dati. È possibile utilizzare qualsiasi tipo di dati predefinito o definito dall'utente all'interno di un'unione in base alle proprie esigenze.

La memoria occupata da un sindacato sarà abbastanza grande da contenere il membro più numeroso del sindacato. Ad esempio, nell'esempio precedente, il tipo di dati occuperà 20 byte di spazio di memoria perché questo è lo spazio massimo che può essere occupato dalla stringa di caratteri. L'esempio seguente mostra la dimensione totale della memoria occupata dall'unione di cui sopra -

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 il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Memory size occupied by data : 20

Accesso ai membri dell'Unione

Per accedere a qualsiasi membro di un sindacato, utilizziamo il member access operator (.). L'operatore di accesso al membro è codificato come un punto tra il nome della variabile di unione e il membro di unione a cui si desidera accedere. Usereste la parola chiave union per definire le variabili di tipo union.

Esempio

Il seguente esempio spiega l'utilizzo di 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); 
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

size of : 16 
data.i : 1917853764 
data.f : 4.12236e+30 
data.str : D Programming

Qui puoi vedere i valori di i e f membri di union si sono corrotti perché il valore finale assegnato alla variabile ha occupato la locazione di memoria e questo è il motivo per cui il valore di str membro viene stampato molto bene.

Ora esaminiamo ancora una volta lo stesso esempio in cui useremo una variabile alla volta che è lo scopo principale di avere union -

Esempio modificato

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 il codice precedente viene compilato ed eseguito, produce il seguente risultato:

size of : 16 
data.i : 10 
data.f : 220.5 
data.str : D Programming

Qui, tutti i membri vengono stampati molto bene perché viene utilizzato un membro alla volta.