%%%% 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.
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.
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.
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