Enregistrements



next up previous contents index
Next: Pointeurs Up: Quelques éléments de Previous: Entrées - Sorties

Enregistrements

      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.



next up previous contents index
Next: Pointeurs Up: Quelques éléments de Previous: Entrées - Sorties