Sign in Join
Wiki copytemporary

Dynamic array/fr: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
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.
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.
22
3-La partie déclaration est aussi simple que le type [[Array/fr|array]] :
4-```
3+La partie déclaration est aussi simple que le type [[Array/fr|array]] :
4+
5+``` pascal
56var
6- ...
7- MyVariable : array of type;
8- ...
7+ ...
8+ MyVariable : array of type;
9+ ...
910```
1011
11-Le nombre d'éléments peut être défini ou modifié selon les besoins pendant l'exécution du programme en ajoutant l'instruction :
12-```
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
1315begin
14- ...
15- SetLength(MyVariable, ItsNewLength);
16- ...
17- end
16+ ...
17+ SetLength(MyVariable, ItsNewLength);
18+ ...
19+end
1820```
1921
20-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.
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.
2123
22-Les éléments individuels peuvent être accédés comme suit :
23-```
24+Les éléments individuels peuvent être accédés comme suit :
25+
26+``` pascal
2427...
25- SetLength(MyVariable,19);
26- ...
27- MyVariable[18] := 123;
28- ...
29- MyOtherVariable := MyVariable[0];
30- ...
31- WriteLn('MyVariable has ', Length(MyVariable), ' elements'); {should be 19}
32- ...
33- WriteLn('Its range is ', Low(MyVariable), ' to ', High(MyVariable)); {should be 0 to 18}
34- ...
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+...
3538```
3639
37-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).
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).
3841
39-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.
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.
4043
41-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.
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.
4245
43-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)**.
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)**.
4447
45-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).
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).
4649
4750## Voir aussi
4851
49- * [Guide de référence Free Pascal : Tableau dynamique](<http://www.freepascal.org/docs-html/current/ref/refsu15.html#x39-520003.3.1>)
50- * [[Example: Multidimensional dynamic array/fr|Exemple : Tableau dynamique multidimensionnel]]
51- * [[Array/fr|Tableau statique]]
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]]
5255
5356---
54-*From the Free Pascal wiki, page "Dynamic array/fr", as the Internet Archive kept it on 2023-03-22. 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).*
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).*

Back to history