Les variables dynamiques en Pascal


1. Les variables dynamiques ou pointeurs
2. Les pointeurs en Pascal
3. Structures de données dynamiques
4. L'exercice proposé
Cliquez ici pour retourner aux thèmes d'exercices : ....Hyperlien vers page de cours HTML

1. Les variables dynamiques ou pointeurs
 

n rapelle que pendant l'exécution d'un programme, une donnée particulière est contenue dans une case mémoire située dans la mémoire centrale. Chaque case mémoire est associée (ou repérée) par un nombre entier dénommé son adresse. Ci-dessous 3 mémoires contenant chacune une donnée (figurée en rouge) et repérée par son adresse

n pointeur ou variable dynamique est une variable dont la donnée (le contenu) est lui-même une adresse. Ci-dessous la case mémoire d'adresse 804 est censée être un pointeur, son contenu qui vaut 125 est donc une adresse (celle de la case mémoire 125), on dit donc que cette variable "pointe" vers la variable d'adresse 125.
ien sûr dans un langage de programmation évolué on ne manipule pas directement des adresses mémoires mais plutôt des noms symboliques de mémoire qui sont traduits par le compilateur en adresse grâce à sa table des symboles qui contient la corespondance nom-adresse de toutes les variables d'un programme. Ci-dessous nous avons 3 variables x, y et t dont les adresses sont stockées dans la table des symboles, la variable y est supposée être une variable dynamique (ou pointeur) son contenu 125 "pointe" vers la variable t d'adresse 125.

La notion de pointeurs est très commode dans les langages de programmation, car elle permet de représenter simplement des structures de données dynamiques comme les piles, les files, les listes, les arbres etc...

Toutefois le revers de la médaille se situe dans la trop grande proximité d'un pointeur avec le bas niveau, celui de la machine, ce qui nuit à l'abstraction du programme ! C'est pourquoi si les pointeurs sont présents dans le pascal, le C, le C++, ils ont été éliminés dans Java et remplacés par des références qui sont des encapsulations de pointeurs (Delphi travaille essentiellement avec des références mais autorise l'utilisation de pointeurs).
 



2. Les pointeurs en pascal

outes les variables de base en pascal sont de type statique, le type pointeur permet l'utilisation de variable dynamique. Il existe donc en pascal un constructeur de type pointeur c'est un identificateur de type précédé d'une flêche "^"

Syntaxe :

Exemple de déclaration :
Type

 Pentier = ^integer ;
 PString = ^string ;
 PTable = ^Table ;
 Table = Array[1..10] of integer ;
 PEnregistr = ^Enreg ;
 Enreg = record
     nom, prenom :string ;
     age : 1..100 ;
 end;
Nous avons déclaré 4 types de variables pointeurs : Pentier qui pointe vers une variable de type integer, PString qui pointe vers une variable de type string,  PTable qui pointe vers un tableau d'integer, PEnregistr qui pointe vers un enregistrement (record).
 

eprenons dans un programme pascal les types déclarés ci-haut :
 
Le programme pascal
 
La situation en mémoire centrale
program LesPointeurs ;
Type
 Pentier = ^integer ;
 PString = ^string ;
 PTable = ^Table ;
 Table = Array[1..10] of integer ;
 PEnregistr = ^Enreg ;
 Enreg = record
     nom, prenom :string ;
     age : 1..100 ;
 end;
var
 x : Pentier ;
 y : PString ;
 t : PTable ;
 z : PEnregistr ;
begin
 x^ := 12 ;
 y^ := 'abcde' ;
 t^[1] := -1 ;
 t^[2] := -2 ;
 ......
 t^[10] := -10 ;
 z^.nom := 'package' ;
 z^.prenom := 'pédagogique' ;
 z^.age := 3 ;
end.



3. Structures de données dynamiques

uelques exemples de déclaration de structures de données dynamiques représentées par des pointeurs en pascal.
 


Voici une implantation possible de la liste unidirectionnelle en pascal :
type
  ListeUni = ^cell ;
  cell = record
          elt : string ;
          suite : ListeUni ;
 end ;
 

 


Voici une implantation possible de la liste bidirectionnelle en pascal :
type
  ListeBi = ^cell ;
  cell = record
          avant : ListeBi ;
          elt : string ;
          suite : ListeBi ;
 end ;
 

 


                     un arbre binaire
Voici une implantation possible d'un arbre binaire en pascal :
type
  Arbre = ^noeud;
  noeud = record
          elt : string ;
          filsg, filsd : Arbre ;
 end ;
 



4. L'exercice proposé

'assistant propose un exemple de liste linéaire chaînée (unidirectionnelle) et deux exercices testant votre compréhension de l'écriture de cette structure de données en pascal.

L'exemple :

 

Les deux exercices portent sur la même structure figurée ci-dessous, il vous est demandé de répondre à des questions sur cette structure de liste:

l'image de tous les exercices précédents, l'assistant vous indiquera auditivement et visuellement la justesse de votre réponse.