Université des Sciences et Technologies de Lille
Licence Miage - Programmation 1



Cours 8 : Le type enregistrement et les discriminants

Le type enregistrement

Il permet de définir des objets composés hétérogènes, contrairement aux tableaux qui sont homogènes.
    type Date is record
       jour: Positive range 1..31;
       mois: String(1..3);
       annee: Positive;
    end record;
On accède aux champs d'un enregistrement comme ceci :

            D: Date;  ... D.jour  D.mois   D.annee
Pour affecter une valeur complète à un objet de type enregistrement, on peut également utiliser la syntaxe avec agrégats.

       D:=(21, "oct", 1999);  D:=(mois=>"oct", jour=>21, annee=>1999);
Le première notation avec parenthèses n'est valable que pour les enregistrements comportant au moins deux champs. Pour les enregistrements à un seul champs, il faut utiliser la notation =>.

On peut donner des valeurs initiales aux champs des enregistrements.

   type Date is record
       jour: Positive range 1..31;
       mois: String(1..3);
       annee: Positive:=1999;
   end record;
Dans ce cas, lors de la création d'un objet D, D.annee a la valeur par défaut 1999.

NB : le type d'un champ d'enregistrement est nécessairement un type contraint. Sinon, comment pourrait-on contraindre le type à la déclaration ?

Enregistrements à Discriminants

Il est possible de passer des paramètres à un type enregistrement, avec des champs spéciaux, que l'on appelle discriminants.

Discriminant de taille

   subtype Longueur is natural range 0..255;

   type Etat_Civil(N, P: Longueur) is record
      Nom: String(1..N);
      Prenom : String(1..P);
   end record;

   G: Etat_Civil(5,12); -- declaration d'une variable 
Dans cet exemple, le recours à un enregistrement à discriminant permet d'avoir des chaînes de caractères variables.

Lorsque l'on déclare un objet de type enregistrement à dsicriminants, il faut le contraindre, en donnant une valeur aux discriminants, ou en ayant précisé des valeurs par défaut dans le type. Contrairement à la taille d'un tableau, une contrainte de discriminant peut-être modifiée, mais à certaines conditions :

Discriminant de forme

Il est souvent intéressant qu'un type propose plusieurs variantes pour les objets qu'il peut fabriquer.

   type Geometrie is (triangle, Rectangle, Cercle);

   type Figure(Style: Geometrie:=Triangle) is record
      case Style is
         when Triangle  => Hauteur,Base : Float;
         when Rectangle => Largeur, Longueur : Float;
         when Cercle => Rayon : Float;
      end case;
   end record;
On peut ensuite déclarer des objets ou des types spécialisés :

   C:Geometrie(Cercle);
L'avantage est que les trois familles de figures géométriques ont le même type et peuvent donc être manipulées de manière homogène (dans un tableau, en résultat d'une fonction, etc.).

Discriminant et type privé

Le discriminant d'un enrgistrement est donc un champ avec un statut spécifique. En particulier, on peut accéder au champ discriminat même si le type est privé.

   type Etat_Civil(N, P: Longueur) is private; 
private
   ...