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