Programmation D - Unions

UNE unionest un type de données spécial disponible dans D qui vous permet de stocker différents types de données dans le même emplacement mémoire. Vous pouvez définir une union avec plusieurs membres, mais un seul membre peut contenir une valeur à un moment donné. Les unions fournissent un moyen efficace d'utiliser le même emplacement mémoire à des fins multiples.

Définir une union en D

Pour définir une union, vous devez utiliser l'instruction union de la même manière que lors de la définition de la structure. L'instruction union définit un nouveau type de données, avec plus d'un membre pour votre programme. Le format de la déclaration d'union est le suivant -

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

le union tagest facultative et chaque définition de membre est une définition de variable normale, telle que int i; ou float f; ou toute autre définition de variable valide. À la fin de la définition de l'union, avant le point-virgule final, vous pouvez spécifier une ou plusieurs variables d'union, mais c'est facultatif. Voici la façon dont vous définiriez un type d'union nommé Data qui a les trois membresi, f, et str -

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

Une variable de Datatype peut stocker un entier, un nombre à virgule flottante ou une chaîne de caractères. Cela signifie qu'une seule variable (même emplacement de mémoire) peut être utilisée pour stocker plusieurs types de données. Vous pouvez utiliser n'importe quel type de données intégré ou défini par l'utilisateur dans une union en fonction de vos besoins.

La mémoire occupée par un syndicat sera suffisamment grande pour contenir le plus grand membre du syndicat. Par exemple, dans l'exemple ci-dessus, le type de données occupera 20 octets d'espace mémoire car il s'agit de l'espace maximum pouvant être occupé par une chaîne de caractères. L'exemple suivant affiche la taille totale de la mémoire occupée par l'union ci-dessus -

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; 
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Memory size occupied by data : 20

Accès aux membres du syndicat

Pour accéder à tout membre d'un syndicat, nous utilisons le member access operator (.). L'opérateur d'accès aux membres est codé comme un point entre le nom de la variable union et le membre syndical auquel nous souhaitons accéder. Vous utiliseriez le mot clé union pour définir des variables de type union.

Exemple

L'exemple suivant explique l'utilisation de l'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); 
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

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

Ici, vous pouvez voir que les valeurs de i et f les membres de l'union ont été corrompus car la valeur finale assignée à la variable a occupé l'emplacement mémoire et c'est la raison pour laquelle la valeur de str Le député est très bien imprimé.

Maintenant, regardons à nouveau le même exemple où nous utiliserons une variable à la fois, ce qui est le but principal d'avoir l'union -

Exemple modifié

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); 
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

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

Ici, tous les membres sont très bien imprimés car un membre est utilisé à la fois.