• Aucun résultat trouvé

6.3 EXCEPTIONS 1 Motivation

7.2.1 Types articles contraints

En Ada, un article (record) est formé d’un ou de plusieurs éléments appelés

champs où chacun d’eux peut être de n’importe quel type. Un article doit être

déclaré dans une partie déclarative en utilisant un type article visible (sect. 4.4), défini préalablement dans une (autre) partie déclarative. Un ou plusieurs champs peuvent comporter une valeur initiale, comme c’est aussi le cas pour les variables (§ 3.9.2).

Exemple 7.1 Types articles contraints et déclarations d’articles. type T_Jour is range 1..31;

type T_Date is -- Pour traiter des dates

record

Jour : T_Jour;

Mois : T_Mois_De_L_Annee; -- § 5.2.2

Annee : Natural;

end record;

type T_Complexe is -- Pour traiter des nombres complexes

record

Partie_Reelle : Float; -- Champ sans valeur initiale

Partie_Imaginaire : Float := 0.0; -- Champ avec valeur

end record; -- initiale

Noel : constant T_Date := ...; -- Pour le 25 decembre et pour

Paques : constant T_Date := ...; -- Paques; voir § 7.2.2 pour

la

-- valeur de ces constantes

Nombre : T_Complexe; -- Pour representer un nombre

complexe

-- Pour afficher une date

procedure Afficher ( Date : in T_Date );

-- Fonction qui calcule et retourne la date du jour suivant

function Jour_Suivant ( Date : in T_Date ) return T_Date;

Les types articles font partie des types composés (composite types, [ARM 3.2]). Seuls les types articles sans discriminants (contraints) seront exposés dans ce chapitre. Les types articles avec discriminants (non contraints) feront l’objet ultérieurement d’une présentation particulière (chap. 11).

La forme générale d’un type article sans discriminants est la suivante:

GÉNÉRALITÉS 156 record suite_de_champs_1 : identificateur_de_type_ou_sous_type := expression_1; suite_de_champs_2 : identificateur_de_type_ou_sous_type := expression_2; suite_de_champs_3 : identificateur_de_type_ou_sous_type := expression_3; ... suite_de_champs_N : identificateur_de_type_ou_sous_type := expression_N; end record;

• record est un nouveau mot réservé; • identificateur est le nom du type;

• suite_de_champs_i est une liste d’identificateurs séparés par des virgules et désignant les champs du type article;

• identificateur_de_type_ou_sous_type donne le type du champ et éven- tuellement une contrainte;

• expression_i est optionnelle et représente la valeur initiale du champ. 7.2.2 Expressions, agrégats et opérations sur les articles

Les expressions d’un type article sont réduites aux constantes, variables et paramètres de ce type. Si les variables et les paramètres n’amènent aucun commentaire particulier, ce n’est pas le cas des constantes qui nécessitent une valeur lors de leur déclaration. A cet effet, le langage Ada permet la construction de valeurs d’un type article, appelées agrégats (aggregates) et composées d’une valeur par champ de l’article. Les valeurs des champs (fig. 7.1) sont séparées par des virgules et le tout est mis entre parenthèses; ces valeurs sont simplement énumérées (notation par position), ou écrites en utilisant la notation par nom (l’ordre d’écriture est alors libre), ou en mélangeant ces deux façons de faire en commençant obligatoirement par la notation par position (exemple 7.2). Ces différentes possibilités rappellent celles de l’association entre paramètres formels et effectifs lors de l’appel d’un sous-programme (§ 4.3.7).

GÉNÉRALITÉS 157

Figure 7.1 Diagramme syntaxique définissant un agrégat d’article.

Exemple 7.2 Agrégats d’articles.

-- Agregats du type T_Date (probablement)

( 24, Novembre, 1997 ) -- Agregat par position

( 24, Novembre, Annee => 1997 ) -- Deux agregats, par position

( 24, Mois => Novembre, Annee => 1997 ) -- puis par nom

( Jour => 24, Mois => Novembre, Annee => 1997 )-- Deux agregats ( Mois => Novembre, Jour => 24, Annee => 1997 )-- par nom

-- Agregats du type T_Complexe (probablement) ( 0.0, –1.0 )

( 0.0, Partie_Imaginaire => –1.0 )

( Partie_Reelle => 0.0, Partie_Imaginaire => –1.0 ) ( Partie_Reelle | Partie_Imaginaire => 0.0 )

( others => 0.0 )

( 2.0 * X, Partie_Imaginaire => X / 3.0 ) -- On suppose que X

-- est une variable -- de type Float

Le compilateur doit toujours déterminer le type d’un agrégat en considérant les types articles visibles là où l’agrégat est présent. Pour éviter des erreurs de compilation, en particulier lorsque others est utilisé, il est toujours possible de

qualifier l’agrégat, c’est-à-dire de préciser son type en le préfixant par le nom du type suivi d’une apostrophe (exemple 7.3), comme pour les expressions qualifiées (sect. 3.10). ( Agrégat article expression ) , | => identificateur de champ others => expression expression ,

GÉNÉRALITÉS 158

Exemple 7.3 Agrégats qualifiés.

-- Agregats du type T_Date T_Date'( 24, Novembre, 1997 )

T_Date'( 24, Novembre, Annee => 1997 )

T_Date'( Mois => Novembre, Jour => 24, Annee => 1997 ) -- Agregats du type T_Complexe

T_Complexe'( 0.0, –1.0 ) T_Complexe'( others => 0.0 )

Une constante d’article se déclare donc comme une constante d’un type scalaire, en utilisant un agrégat comme valeur de la constante. Notons au passage que les agrégats servent également à donner la valeur initiale d’une variable article ou la valeur par défaut d’un paramètre article (exemple 7.4).

Les opérations possibles sur les articles (en plus de l’affectation et du passage en paramètre) sont l’égalité = et l’inégalité /= .

7.2.3 Affectation

L’affectation se fait de manière habituelle, comme dans l’exemple 7.4. Exemple 7.4 Affectation et passage en paramètre de valeurs d’un type article.

-- ...

procedure Exemple_7_4 is

type T_Complexe is -- Pour traiter des nombres complexes

record

Partie_Reelle : Float; Partie_Imaginaire : Float;

end record;

I : constant T_Complexe := (0.0, 1.0); -- Une constante et

Nombre_1 : T_Complexe; -- deux variables de

Nombre_2 : T_Complexe := (1.0, 0.0); -- ce type

---

procedure Exemple (Z : in T_Complexe := (0.0, 0.0) ) is

... end Exemple; begin -- Exemple_7_4 Nombre_1 := I; Nombre_1 := Nombre_2; Nombre_2 := ( 3.5, 4.8 );

-- Qualification souhaitable mais pas indispensable Nombre_2 := T_Complexe'(others => 0.0);

GÉNÉRALITÉS 159

-- Qualification possible mais pas indispensable Exemple ( T_Complexe'(3.5, 4.8) );

Exemple ( (3.5, 4.8) ); Exemple ( I );

-- Utilisation de la valeur par defaut Exemple;

...

Il faut insister sur le fait que les champs d’un type article peuvent être de n’importe quel type y compris un type article. Mais dans le cas d’un type composé pour un champ [ARM 3.2] il faut alors que ce type soit contraint (§ 7.2.1 et 8.2.2) ou un type article à discriminants avec valeurs par défaut (sect. 11.3). Un article sans discriminants est toujours contraint. Enfin, une fonction peut retourner un article comme résultat.

Il existe des attributs applicables à un article ou un type article mais leur utilisation est réservée à des situations particulières. Par contre, il n’y a pas d’en- trées-sorties prédéfinies sur les articles.

Tout agrégat doit être complet, c’est-à-dire qu’il doit contenir exactement une expression pour chaque champ. Cette règle est parfaitement naturelle puisqu’un agrégat représente un article avec une valeur pour chacun de ses champs! De plus, un agrégat formé d’une seule expression doit être écrit en utilisant la notation par nom.

ACCÈS AUX CHAMPS D’UN ARTICLE 160