Dynamic array/fr: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: Dynamic array/fr
| Old | New | Line | |
|---|---|---|---|
| 1 | + | Le tableau dynamique est une jolie caractéristique de la syntaxe Free Pascal (et Delphi). Elle est très similaire au type [[Array/fr|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. | |
| 2 | + | ||
| 3 | + | La partie déclaration est aussi simple que le type [[Array/fr|array]] : | |
| 4 | + | ||
| 5 | + | ``` pascal | |
| 6 | + | var | |
| 7 | + | ... | |
| 8 | + | MyVariable : array of type; | |
| 9 | + | ... | |
| 10 | + | ``` | |
| 11 | + | ||
| 12 | + | Le nombre d'éléments peut être défini ou modifié selon les besoins pendant l'exécution du programme en ajoutant l'instruction : | |
| 13 | + | ||
| 14 | + | ``` pascal | |
| 15 | + | begin | |
| 16 | + | ... | |
| 17 | + | SetLength(MyVariable, ItsNewLength); | |
| 18 | + | ... | |
| 19 | + | end | |
| 20 | + | ``` | |
| 21 | + | ||
| 22 | + | 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. | |
| 23 | + | ||
| 24 | + | Les éléments individuels peuvent être accédés comme suit : | |
| 25 | + | ||
| 26 | + | ``` pascal | |
| 27 | + | ... | |
| 28 | + | SetLength(MyVariable,19); | |
| 29 | + | ... | |
| 30 | + | MyVariable[18] := 123; | |
| 31 | + | ... | |
| 32 | + | MyOtherVariable := MyVariable[0]; | |
| 33 | + | ... | |
| 34 | + | WriteLn('MyVariable has ', Length(MyVariable), ' elements'); {should be 19} | |
| 35 | + | ... | |
| 36 | + | WriteLn('Its range is ', Low(MyVariable), ' to ', High(MyVariable)); {should be 0 to 18} | |
| 37 | + | ... | |
| 38 | + | ``` | |
| 39 | + | ||
| 40 | + | 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). | |
| 41 | + | ||
| 42 | + | 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. | |
| 43 | + | ||
| 44 | + | 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. | |
| 45 | + | ||
| 46 | + | 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)**. | |
| 47 | + | ||
| 48 | + | 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). | |
| 49 | + | ||
| 50 | + | ## Voir aussi | |
| 51 | + | ||
| 52 | + | - [Guide de référence Free Pascal : Tableau dynamique](http://www.freepascal.org/docs-html/current/ref/refsu15.html#x39-520003.3.1) | |
| 53 | + | - [[Example: Multidimensional dynamic array/fr|Exemple : Tableau dynamique multidimensionnel]] | |
| 54 | + | - [[Array/fr|Tableau statique]] | |
| 55 | + | ||
| 56 | + | --- | |
| 57 | + | *From the Free Pascal wiki, page "Dynamic array/fr", as it stood on 2020-02-14 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
