Les modules

%%%% le source du module ModuleEx.p
UNIT ModuleEx;

{éventuellement, si ce module s'appuie 
 sur d'autres modules : uses ...}

INTERFACE

CONST 
   Un = 1;

{éventuellement, pour un usage public :
        type ...
        var  ... }

        procedure AjouteUn (var i:integer);
        function Ajoute1(i:integer):integer; 
       
IMPLEMENTATION

{éventuellement, pour un usage privé 
 dans ce module :
        const ...
        type  ...
        var   ... }

{On ne réécrit pas les paramètres}

PROCEDURE AjouteUn;
BEGIN
   i := i + 1;
END;

{idem}  
        
FUNCTION Ajoute1;
BEGIN
   Ajoute1 := i + 1;
END;

END.

%%%% le source du programme Test.p

PROGRAM Test;

USES ModuleEx;

VAR 
   i: INTEGER;

BEGIN
   i := Un;
{Un est défini dans le module ModuleEx,}
   writeln('i = ',i);
   AjouteUn(i);
{la proc AjouteUn aussi}
   writeln('i = ',i);      
   writeln('i+1 = ',Ajoute1(i));
{et la fonction Ajoute1 également.}
   writeln('i = ',i);      
END.

Les pointeurs

PROGRAM ptr;

TYPE
   PtrSurEntier = ^INTEGER;

{rappel : un integer est codé sur 2 octets 
 en Think Pascal}

VAR
   p1: ptrSurEntier;
   p2: ptrSurEntier;

{rappel : opérations possibles 
 sur des pointeurs de même type :
        new(p1), dispose(p1), p1^,
        p1 := p2, p1 := NIL, 
        p1 = p2, p1 <> p2}

BEGIN

   writeln(p1); 
{une adresse indéfinie est affichée}
   new(p1);         
{un bloc B1 de 2 octets consécutifs est réservé}
   writeln(p1);
{dont l'adresse en mémoire est la valeur de p1}
   writeln(p1^);
{affichage d'un entier indéfini}
   p1^:=1;
{p1 pointe sur la représentation de l'entier 1}
   writeln(p1^);
{qu'on affiche}
   writeln(p2);
{une autre adresse indéfinie}
   p2:=p1;
{p2 pointe sur le même bloc B1 que p1}
   p2^:=p2^+1;
{l'entier pointé par p2 est incrémenté d'une unité}
   writeln(p2^);
{affiche 2}
   writeln(p1^);
{affiche 2 (précisément le même 2 !)}
   dispose(p1);
{le bloc B1 est rendu au système, qui peut 
 éventuellement l'utiliser pour ses besoins
 propres ; l'emploi de p1^ et p2^ est à 
 présent une erreur}
   new(p2);
{un nouveau bloc B2 de 2 octets consécutifs est 
 réservé}
   writeln(p2);
{affiche l'adresse de B2}
   writeln(p2^);
{affiche un entier indéfini}
   p2:=NIL;
{les 2 octets consécutifs du bloc B2 sont perdus 
 à jamais !}
   writeln(p2);

{NIL est codé OOOOOOOO par Think Pascal}

END.

Un (début de) module pour les listes chainées

UNIT unit_liste;

INTERFACE

TYPE
   pointeur = ^cellule;
   cellule = RECORD
        info: INTEGER;
        suivant: pointeur;
   END;

PROCEDURE EntreeListe1 (var liste: pointeur);
PROCEDURE EntreeListe2 (var liste: pointeur);
PROCEDURE AfficheListe (liste: pointeur);

IMPLEMENTATION

PROCEDURE EntreeListe1;
VAR
   p: pointeur;
   n: INTEGER;
BEGIN
   liste := NIL;
   readln(n);
   WHILE n >= 0 DO
   BEGIN
      new(p);
      p^.info := n;
      p^.suivant := liste;
      liste := p;
      readln(n);
   END;
END;

PROCEDURE EntreeListe2;
VAR
   p, der: pointeur;
   n: INTEGER;
BEGIN
   readln(n);
   IF n < 0 THEN 
      liste := NIL
   ELSE
   BEGIN
      new(liste);
      liste^.info := n;
      der := liste;
      readln(n);
      WHILE n >= 0 DO
      BEGIN
         new(p);
         p^.info := n;
         der^.suivant := p;
         der := p;
         readln(n);
      END;
      der^.suivant := NIL;
   END;
 END;

PROCEDURE AfficheListe;
BEGIN
   writeln;
   WHILE (liste <> NIL) DO
   BEGIN
      writeln(liste^.info);
      liste := liste^.suivant;
   END;
END;

END.

%%%%%%%%%%%%%%%%%%%%%%%%%%

PROGRAM TestModPtr;

USES
   unit_liste;

VAR
   liste1: pointeur;

BEGIN
   EntreeListe1(liste1);
   AfficheListe(liste1);
   writeln;
   EntreeListe2(liste1);
   AfficheListe(liste1);
END.

%%%%%%%%%%%%%%%%%%%%%%%%%%

Remarque :
Pour compiler un programme composé de modules :

Si c'est trop tard, utiliser l'item Remove (menu Projet) pour supprimer les fichiers du projet, puis Add File (menu Projet) pour reconstruire le projet avec l'ordre idoine.

Àpropos de ce document...

This document was generated using the LaTeX2HTML translator Version 96.1 (Feb 5, 1996) Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, Computer Based Learning Unit, University of Leeds.

The command line arguments were:
latex2html -split 0 pointeurs.tex.

The translation was initiated by Jean-Christophe Soulie on mardi, 4 mai 1999, 17:06:39 GMT+4


Jean-Christophe Soulie
mardi, 4 mai 1999, 17:06:39 GMT+4