Structures de Données Dynamiques
Structures de Données Dynamiques
Structures de Données Dynamiques
Lorsqu'elles sont globales, la mémoire est allouée (réservée) au début du programme et est
libérée lorsque le programme se termine.
Lorsque les variables sont locales à une procédure ou fonction, la mémoire est allouée au
début de la procédure ou fonction et la mémoire est libérée à la fin de celle-ci.
Question: Notez ici les tailles de piles maximales et minimale de votre projet.
Plus vous avez besoin de mémoire plus la taille maximale de la pile doit être élevée.
La mémoire est constituée de cellules d'un octet chacune. Chaque cellule a une adresse. (son
numéro).
Les variables sont stockées dans la pile. Chaque variable a une adresse: l'adresse de la
première cellule qui lui est réservée.
Prenons par exemple une variable de type réel "prix" Admettons que le réel est stocké sur 8
octets .Son adresse sera l'adresse de la première cellule qui lui est réservée. "6825300".
6825308
6825300
6825299
En jaune, vous voyez l'ensemble de la zone mémoire réservée et en rouge l'adresse de notre
variable.
Une variable déclarée ensuite aura comme adresse: 6825308 l'adresse de la première cellule
libre de la pile. Remarque alors que les variables globales sont stockées en montant du bas de
la pile au milieu de la pile. Les variables locales sont elles stockées depuis le sommet de la
pile vers le milieu.
On utilisera la fonction addr(nom de variable) qui fournit l'adresse de la variable dont le nom
est passé en paramètre.
Edit1.text:=intToStr(Integer(addr(lavariable)));
Calculer la différence entre les deux adresses qu'en déduit-on sur la taille réservée pour un
byte?
Faire de même pour deux variables de type "INTEGER" sur combien d'octets tient un
INTEGER ?
TClient = record
nom:string(25);
prenom:string(10);
end;
Notion de pointeur:
Pour allouer dynamiquement de la mémoire au fur et à mesure des besoins, réserver des zones
dans la pile, nous avons besoin de la notion de pointeur.
Lorsqu'un pointeur pointe sur rien il est égal à nil (Non Identified Link).
La valeur d'un pointeur est l'adresse de début de la zone mémoire sur laquelle il pointe.
Var monpointeur : POINTER; ici on ne sait pas sur quel type de donnée il pointe.
Exercice:
Procedure form1.button1click(sender:tobject);
Var monentier:integer;
monpointeur:^integer;
begin
monentier:=4;
monentier
if monpointeur^ =4 then // se lit si la zone référencée par monpointeur est égale à 4 …
label2.caption:=inttostr(monentier);
end;
Qu'a-t-on appris:
Cela signifie que dans les zones réservées aux deux pointeurs, on ne pourra mettre que des
entiers.
Cela signifie aussi que les zones réservées auront une taille permettant d'y stocker des entiers.
Ces deux pointeurs sur entiers sont donc déclarés mais ils sont encore = à nil.
Pour qu'ils pointent sur quelque chose, il faut soit leur donner comme valeur l'adresse d'une
variable existante comme dans le code précédent: ptr_entier1:=addr(monentier);
New(ptr_entier1)
Elle réservera donc une cellule si ptr_entier1 est un pointeur sur byte, 4 cellules si ptr-entier1
est un pointeur sur INTEGER et par exemple 26 cellules si ptr_entier1 est un pointeur sur
chaîne(25).
Begin
//premier exemple:
End;
Attention: Toute allocation dynamique doit être libérée sinon vous obtenez un programme qui
plante au bout d'un certain temps.
LePointeur:=Nil;
Utilisation des pointeurs:
Voici un exemple d'utilisation des pointeurs.
TYPE
T_Ptr_client =^T_Client;
T_Client= enregistrement
Nom:string;
Pnom:string;
End;
Var ptr_moncli:T_Ptr_client;
Begin
new(ptr_moncli); //la quantité de mémoire réservée est fonction du type du contenu vers
Ptr_moncli^.nom:=dupond;
Ptr_moncli^.prenom:=dupond;
Afficher(Ptr_moncli^.nom)
Afficher(Ptr_moncli^.prenom)
free(Ptr_moncli);
End;
On voit dans cet exemple qu'un pointeur peut pointer sur un type utilisateur structuré.
Afin de ne pas avoir à déclarer autant de pointeurs sur client que l'on a de client on doit créer
des structures dynamiques de données.
On pourra créer des piles, des files, des listes chainées doublement chainées et circulaires ou
des arbres .
Les Listes chaînées:
T_Ptr_client =^T_Client;
T_Client= enregistrement
Nom:string;
Pnom:string;
P_suiv:T_Ptr_client;
End;
Procedure ajoutclient;
begin
if P_prem=nil then
begin
New(P_prem);
P_prem^.nom:=editnom.text;
P_prem^.pnom:=editpnom.text;
End
Else
begin
New (p_nouv);
P_nouv^.nom:=editnom.text;
P_nouv^.pnom:=editpnom.text;
//
p_cli:=p_prem_cli;
while p_cli^.suiv<>nil do
begin
p_cli:=pcli^.suiv;
end;
pcli^.suiv:=p_nouv;
end;
Exercices: