Manuel de suivi dynamique Solaris

Tableaux associatifs

Les tableaux associatifs servent à représenter les ensembles d'éléments de données que vous pouvez récupérer en spécifiant un nom appelé une clé. Les clés de tableau associatif en D sont constituées de valeurs d'expression scalaires appelées un tuple. Vous pouvez imaginer le tuple de tableau lui-même comme une liste de paramètres imaginaires vers une fonction appelée pour récupérer la valeur de tableau correspondante lors du référencement du tableau. Chaque tableau associatif en D comporte une signature de clé fixe consistant en un nombre fixe d'éléments de tuple, chaque élément ayant un type fixe donné. Vous pouvez définir différentes signatures de clé par tableau dans votre programme en D.

Les tableaux associatifs diffèrent des tableaux normaux de taille fixe en ce qu'ils n'ont aucune limite prédéfinie en matière de nombre d'éléments. Les éléments peuvent être indexés par un tuple par opposition à la simple utilisation de nombres entiers comme clés. Par ailleurs, les éléments ne sont pas enregistrés dans des emplacements de stockage consécutifs pré-alloués. Les tableaux associatifs sont utiles dans les situations dans lesquelles vous devez utiliser une table de hachage ou une autre structure de données de dictionnaire simple dans un programme en langage C, C++ ou Java. TM Les tableaux associatifs vous permettent de créer un historique dynamique des événements et de l'état capturé dans votre programme en D que vous pouvez utiliser pour créer des flux de contrôle plus complexes.

Pour définir un tableau associatif, vous écrivez une expression d'affectation du formulaire :

name [ key ] = expression ;

name correspond à un identificateur D valide et key à une liste séparée par des virgules d'une ou plusieurs expressions. Par exemple, l'instruction suivante définit un tableau associatif a avec la signature de clé [ int, string ] et enregistre la valeur entière 456 à l'emplacement nommé par le tuple [ 123, "hello" ]:

a[123, "hello"] = 456;

Le type de chaque objet contenu dans le tableau est également fixe pour tous les éléments d'un tableau donné. Comme a a été affecté en premier à l'aide du nombre entier 456, chaque valeur ultérieure enregistrée dans le tableau aura également comme type int. Vous pouvez utiliser les opérateurs d'affectation définis dans le chapitre 2 pour modifier les éléments de tableau associatif en fonction des règles d'opérande définies par l'opérateur. Le compilateur D crée un message d'erreur approprié si vous tentez une affectation incompatible. Vous pouvez utiliser les mêmes types avec une clé ou une valeur de tableau associatif que ceux utilisés avec une variable scalaire. Vous ne pouvez pas imbriquer un tableau associatif dans un autre sous forme de clé ou de valeur.

Vous pouvez référencer un tableau associatif à l'aide d'un tuple compatible avec la signature de la clé du tableau. Les règles de compatibilité du tuple sont similaires à celles des appels de fonction et des affectations de variable : La longueur du tuple doit être la même et chaque type de la liste de paramètres réels doit être compatible avec le type correspondant dans la signature de clé formelle. Par exemple, si un tableau associatif x est défini comme suit :

x[123ull] = 0;

la signature de clé est de type unsigned long long et les valeurs sont de type int. Vous pouvez également référencer ce tableau à l'aide de l'expression x['a'], car le tuple consistant en une constante caractère 'a' de type int et en une longueur de 1 est compatible avec la signature de clé unsigned long long conformément aux règles de conversion arithmétique décrites à la section Conversions de types.

Si vous devez déclarer de manière explicite un tableau associatif en D avant de l'utiliser, vous pouvez créer une déclaration du nom du tableau et de la signature de clé en dehors des clauses de la sonde dans le code source de votre programme :

int x[unsigned long long, char];

BEGIN
{
	x[123ull, 'a'] = 456;
}

Une fois un tableau associatif défini, les références à un tuple d'une signature de clé compatible sont autorisées même si le tuple en question n'a pas été affecté précédemment. L'accès à un élément de tableau associatif non affecté est défini pour revenir sur un objet rempli de zéros. Cette définition a notamment pour conséquence que le stockage sous-jacent n'est pas alloué à un élément de tableau associatif tant qu'une valeur différente de zéro est affectée à cet élément. À l'inverse, l'affectation de la valeur zéro à cet élément de tableau associatif pousse DTrace à supprimer l'allocation de stockage sous-jacent. Ce comportement est important car l'espace d'adressage dynamique en dehors duquel les éléments du tableau sont alloués est fini ; si cet espace est épuisé lors d'une tentative d'allocation, cette dernière échoue et un message d'erreur est généré indiquant un abandon de variable dynamique. Affectez toujours des zéros aux éléments de tableaux associatifs qui ne sont plus utilisés. Pour connaître d'autres techniques visant à supprimer les abandons de variables dynamiques, reportez-vous au Chapitre16Options et paramètres réglables.