Les enregistrements (records en anglais) permettent de regrouper
des informations hétérogènes. Ainsi, on peut déclarer un type
Date comme suit:
type
Jour = 1..31;
Mois = (Jan, Fev, Mar, Avr, Mai, Juin, Juil,
Aou, Sep, Oct, Nov, Dec);
Annee = 1..2100;
Date = record
j: Jour;
m: Mois;
a: Annee;
end;
var
berlin, bastille: Date;
begin
berlin.j := 10; berlin.m := Nov; berlin.a := 1989;
bastille.j := 14; bastille.m := Juil; bastille.a := 1789;
end.
Un enregistrement peut contenir des champs de tout type, et notamment d'autres enregistrements. Supposons qu'une personne soit représentée par son nom, et sa date de naissance; le type correspondant sera
type
Personne = record
nom: Chaine;
naissance: Date;
end;
var
poincare: Personne;
begin
poincare.nom := 'Poincare';
poincare.naissance.j := 29;
poincare.naissance.m := Avr;
poincare.naissance.a := 1854;
end.
Un enregistrement peut avoir une partie fixe et une partie variable. La partie fixe est toujours au début, le variant à la fin. Ainsi si on suppose que les nombres complexes sont représentés en coordonnées cartésiennes ou en coordonnées polaires, on pourra écrire
type
Coordonnees = (Cartesiennes, Polaires);
Complexe = record
case c: Coordonnees of
Cartesiennes: (re, im: real);
Polaires: (rho, theta: real);
end;
var x,y: Complexe;
begin
x.c := Cartesiennes; x.re := 0; x.im := 1;
x.c := Polaires; x.rho := 1; x.theta := PI/2;
end.
Dans cet exemple, la partie fixe est vide, ou plus
exactement réduite au champ c représentant l'indicateur du
variant. Ce champ peut prendre la valeur Cartesiennes ou
Polaires qui permet de décider quelle variante on veut de la
partie variable de l'enregistrement. Ainsi, une rotation de
s'écrira
function RotationPiSurDeux (x: Complexe): Complexe;
var r: Complexe;
begin
if x.c = Cartesiennes then
begin
r.re := -x.im;
r.im := x.re;
end
else
begin
r.rho := x.rho;
r.theta := x.theta + PI/2;
end;
RotationPiSurDeux := r;
end;
Très peu d'implémentations de Pascal vérifient que le champ d'un variant n'est accédé que si l'indicateur correspondant est positionné de manière cohérente. C'est un des trous bien connus du typage de Pascal, puisqu'on peut voir un même objet comme un réel ou un entier sans qu'il n'y ait une quelconque correspondance entre les deux. On peut même ne pas mettre d'indicateur, et n'avoir aucune trace dans l'enregistrement sur le cas choisi dans la partie variant de l'enregistrement. Il suffit de mettre un type ordinal à la place de l'indicateur. Ainsi les complexes sans indicateur de variant s'écrivent
type
Coordonnees = (Cartesiennes, Polaires);
Complexe = record
case Coordonnees of
Cartesiennes: (re, im: real);
Polaires: (rho, theta: real);
end;
Alors il n'y a plus l'indicateur c et savoir si un
nombre complexe est pris en coordonnées cartésiennes ou polaires est
laissé complètement à la responsabilité du programmeur et à la
logique du programme.
Enfin, il faut signaler l'instruction with qui marche souvent
avec les enregistrements. Ainsi, si x est un nombre complexe,
with x do
begin
re := 1;
im := 0;
end;
est une abréviation pour
x.re := 1; x.im := 0;
Ici il n'est pas bien clair si l'écriture est plus
compacte. Mais dans le cas où le calcul de l'enregistrement x
est très compliqué, l'écriture peut être commode. Toutefois, cette
instruction peut prêter très rapidement à confusion, notamment si
plusieurs with sont imbriqués. D'ailleurs, il y a une
commodité pour écrire
with $r_1$, $r_2$, - do
$S$
à la place de
with $r_1$ do
with $r_2$ do
-
$S$
Une bonne règle est peut être de ne pas utiliser l'instruction
with.