Dynamic array/fr

From Free Pascal wiki
Jump to: navigation, search

English (en) français (fr) 日本語 (ja)

Le tableau dynamique est une jolie caractéristique de la syntaxe Free Pascal (et Delphi). Elle est très similaire au type array, mais permet plus de flexibilité pour le programmeur puisque le nombre d'éléments n'a pas besoin d'être connu avant l'exécution.

La partie déclaration est aussi simple que le type array :

var
  ...
  MyVariable : array of type;
  ...

Le nombre d'éléments peut être défini ou modifié selon les besoins pendant l'exécution du programme en ajoutant l'instruction :

begin
  ...
  SetLength(MyVariable, ItsNewLength);
  ...
end

Vous pouvez utiliser autant d'instructions SetLength que vous voulez pour étendre ou tronquer un tableau mais vous devez poser au moins une telle instruction avant de pouvoir utiliser la variable pour la première fois.

Les éléments individuels peuvent être accédés comme suit :

...
SetLength(MyVariable,19);
...
MyVariable[18] := 123;
...
MyOtherVariable := MyVariable[0];
...
WriteLn('MyVariable has ', Length(MyVariable), ' elements');  {should be 19}
...
WriteLn('Its range is ', Low(MyVariable), ' to ', High(MyVariable)); {should be 0 to 18}
...

L'index d'un tableau dynamic est en base ZERO i.e. il doit être dans l'intervalle de 0 à (Length-1). Il n'est possible de passer à un système de base UN (tel le langage Basic).

Réellement, les tableaux dynamiques sont des pointeurs avec un déréférencement automatique. Ils sont initialisés à Nil automatiquement. Cela signifie que MyVariable est interprétée comme une variable pointeur quand elle est employée avec des routines de bas niveau telles fillchar, sizeof, etc. mais elle est automatiquement développée en MyVariable^ en indexant ses éléments (comme dans MyVariable[2]) ou en l'employant avec des routines attendant des types tableau.

Vu de la gestion mémoire, les variables tableau dynamique sont de simples pointeurs. SetLength alloue et libère de la mémoire sur le tas quand demandé. Quand un tableau est utilisé dans une fonction ou une procédure, seul le pointeur est ajouté dans la pile. Quand la procédure est quittée, la variable tableau dynamqiue est supprimée et la mémoire est rendue à nouveau disponible. En fait, les procédure de gestion de mémoire sont insérées dans le programme exécutable et le résultat est totalement transparent pour le programmeur.

En affectant nil à une variable tableau dynamique, la mémoire désignée par le pointeur est automatiquement libérée. C'est équivalent à SetLength(MyVariable, 0). Cela peut avoir un effet de bord, si la valeur du pointeur n'est pas valide pour différente raisons (i.e., cela a été lu depuis le disque où cela a été enregistré lors d'une précédente exécution). Pour éviter un tel pointeur invalide, vous devez utiliser FillChar(MyVariable,sizeof(MyVariable), #0).

Alors qu'écrire dans les éléments d'un tableaux dynamique ne créée pas de nouvelle instance du tableau (pas de copy-on-write comme cela existe pour les AnsiStrings), l'emploi de SetLength créée une copîe ! Ainsi si deux variables tableaux dynamique pointent sur le même tableau (l'une a été affectée à l'autre), ils ne sont plus les mêmes après l'emploi de SetLength sur l'une d'eux (ou sur les deux). Après l'appel à SetLength(), les deux variables sont des tableaux distincts dont les éléments sont indépendants les uns des autres (à nuancer toutefois si les éléments sont des références d'objets ou des pointeurs, les références sont dupliquées mais pas les objets eux-mêmes).

Voir aussi