bonjour
pourquoi on utilise SETLENGTH alors qu'on peut utiliser le tableau dynamique sans l'initialiser ?
Merci
bonjour
pourquoi on utilise SETLENGTH alors qu'on peut utiliser le tableau dynamique sans l'initialiser ?
Merci
Bonjour,
Tu ne peux utiliser un tableau dynamique sans avoir définie sa taille. Pour cela tu dois passer par un setlength. Cela permets au compilateur de réserver la mémoire dont tu vas avoir besoin pour ton tableau.
Salut;
et pourtant l'aide de Delphi est assez explicite :
sauf si tu veux dire autre chosePour les tableaux dynamiques,SetLength peut prendre plusieurs paramètres de longueur (autant que le nombre de dimensions du tableau).Chaque paramètre spécifie le nombre d'éléments avec une dimension particulière.![]()
Voila un bout de code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Procedure TForm1.Tab(tab_champs_condi : array of string) ; var i,max_tab: integer; begin max_tab := High(tab_champs_condi); for i := 0 to max_tab do showmessage(tab_champs_condi[i]); // end; procedure TForm1.Button1Click(Sender: TObject); begin Tab(['alpha','zoulou','toutou','7','3','81','7']); // et l'infini end;
Ok, mais il ne s'agit pas d'un tableau dynamique, mais d'un tableau ouvert.
Extrait de l'aide :
Envoyé par Extrait de l'aide
Cordialement
Quels différences entre le tableau Dynamique et le tableau Ouvert ???
Salut
Dans la phrase que tu as écrite, puis dans le bout de code que tu as montré, tu fais un amalgame entre 2 choses :
- l'initialisation du tableau
- l'utilisation du tableau.
D'une manière générale : si tu utilises un tableau de 10 cases quelque part dans ton programme, il a bien fallu, à un moment ou à un autre, que ton programme demande au système de la mémoire pour pouvoir stocker ces 10 cases.
Dans ton exemple, tu appelles ta fonction "Tab" sur un tableau constant, déclaré à même le code : "['alpha','zoulou','toutou','7','3','81','7']". Quand tu compiles ton exemple, le programme dait donc qu'il doit réserver assez de place pour stocker les 7 chaines de caractère. Tu n'as pas écrit explicitement de "SetLength" ou de "GetMem", mais l'allocation est là.
Tu aurais pu écrire un autre exemple :
Dans le corps de la fonction "Tab", par contre, le tableau "tab_champs_condi" est un argument de la fonction. Il fait donc référence à un tableau, qui a à priori déjà été alloué, avant l'appel à cette fonction. Delphi te cache tout un mécanisme qu'il utilise pour gérer les tableaux de manière dynamique ; mais par exemple, quand tu appelles la fonction "High( tab_... )", il est capable de te donner la taille du tableau à ce moment là de l'exécution - ce qui signifie que d'une manière ou d'une autre, il l'a stockée quelque part, par exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 procedure TForm1.Button1Click(Sender: TObject); var LTableau : array of string; begin SetLength(LTableau, 7); //<- ici, tu demandes explicitement de la place pour 7 cases... LTableau[0] := 'alpha'; LTableau[1] := 'zoulou'; LTableau[2] := 'toutou'; LTableau[3] := '7'; LTableau[4] := '3'; LTableau[5] := '81'; LTableau[6] := '7'; Tab(LTableau); // et l'infini end;
Pour faire sommaire :Quels différences entre le tableau Dynamique et le tableau Ouvert ???
Quand tu déclares le type "array of string" dans une section Var (par ex: le "LTableau : array of string;" ci-dessus), tu déclares un tableau dynamique. Tu peux entre autres réallouer ce tableau (en faisant "SetLength( LTableau, 7);" );
Quand tu délcares le type "array of string" lors de la déclaration des paramètres d'une fonction (par ex: le "tab_champs_condi : array of string" de ton exemple), tu déclares un tableau ouvert. Ce tableau peut avoir n'importe quelle taille, et Delphi te donne accès à divers paramètres du tableau avec la même interface qu'un tableau dynamique ( "High" te donne le plus haut indice, "Length" la longueur, "tab[i]" te permet d'accéder au contenu de la i-ème case ) mais tu ne peux pas le réallouer.
En fait(*) quand tu écris une fonction qui prend en argument un "array of Truc", lorsque tu appelles la fonction, Delphi recopie le contenu du tableau passé en argument sur la pile, puis utilise cette copie dans le corps de la fonction. Comme le tableau est alloué sur la pile, il ne peut pas s'amuser à le retailler...
Un exemple pour illustrer :
Hmmm.... je ne suis pas sûr d'avoir étét limpide dans mes explications, ni d'avoir répondu directement à tes questions, mais j'espère que ça t'aidera.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 PROGRAM FourreTout; {$APPTYPE CONSOLE} //Affiche le contenu d'un tableau : procedure ShowTab( ATab : array of string ); var i : integer; begin for i := 0 to High(ATab) do WriteLn( ATab[i] ); WriteLn; end; //Modifie le contenu de la variable passée en argument, et affiche son nouveau contenu : procedure ModifierTab( ATab : array of string ); begin //SetLength( ATab, 5 ) <-- ATab[0] := 'Hello'; ATab[1] := 'World'; ShowTab(ATab); end; VAR LTab : array of string; LTab3 : array[0..2] of string; BEGIN //Que ce soit pour LTab ou pour LTab3, le contenu de la variable initiale //n'est pas modifié après le passage dans ModifierTab : WriteLn( ' *** LTab3 :'); LTab3[0] := 'a'; LTab3[1] := 'b'; LTab3[2] := 'c'; ShowTab( LTab3 ); ModifierTab( LTab3 ); ShowTab( LTab3 ); WriteLn( ' *** LTab, setlength 3 :' ); SetLength( LTab, 3 ); LTab[0] := 'Riri'; LTab[1] := 'Fifi'; LTab[2] := 'LouLou'; ShowTab( LTab ); ModifierTab( LTab ); ShowTab( LTab ); ReadLn; END.
*LeGEC*
(*)si j'ai bien compris... je ne suis pas sûr d'avoir entièrement compris, et je veux bien quelques explications plus claires à ce sujet.
Bravo LeGEC bel effort
Partager