• Aucun résultat trouvé

Les types construits et les constructeurs de types :

Il existe en Ada des constructeurs syntaxiques permettant de « fabriquer » ses propres types. On parle alors de types construits en opposition avec les 6 types prédéfinis. Il existe des constructeurs de :

types énumératifs. Cours 2 (ce cours ci : voir pages plus loin) types tableaux. Cours 4

types articles. Cours 6 types accès. Cours 12

types privés. Cours 7

types dérivés. Cours 10 et numérique 1

types entiers Cours 2 (ce cours ci : voir pages plus loin) types réels. Cours numérique 1 et 2

types tâches. Cours tâches (début trimestre 2 voir planning) et aussi le type « protégé »

Construction d’un type entier signé :

La règle de construction d’un type entier signé est définie par le D.S. suivant :

type identificateur is range intervalle ;

Exemples (remarquez l’utilisation des trois mots réservés Ada : type, is et range) :

type T_TEMPERATURE is range -78..123; type T_ETAGE is range -5..12;

type T_MONTANT is range 0..2_000_000;

 D. Feneuille I.U.T 2001 (cours n°2 fichier COURS2.DOC) 30/06/02

4

On rappelle que ces 4 types d’entiers construits sont incompatibles entre eux ! Et c’est heureux ! Les opérateurs ont été vus dans le cours précédent (D.S. et littéraux numériques):

+, -, *, /, mod, rem, abs, **

Les attributs des types entiers sont les mêmes que ceux du type Character et plus généralement sont ceux des types discrets (voir plus loin) mot générique qui regroupe des types ayant des propriétés identiques. Nous ne nous étendrons pas sur les opérateurs connus ! Seuls mod et rem méritaient un bon développement et ceci a déjà été fait dans le cours précédent. Enfin, abs désigne, évidemment, la valeur absolue (bien connue !).

Construction d’un type entier modulaire :

La règle de construction d’un type entier modulaire est définie par le D.S. suivant :

type identificateur is mod entier positif ;

Exemples (remarquez l’utilisation des trois mots réservés Ada : type, is et mod) :

type T_Heure is mod 24; -- valeurs entre 0 et 23 type T_Octet is mod 256; -- valeurs entre 0 et 255

La différence essentielle par rapport au type entier signé est l’arithmétique (modulo) ainsi si on a : L_Heure : T_Heure := 23 ;

Puis L_Heure := L_Heure + 1 ; -- L_Heure vaut alors 0 Quelques problèmes à dominer :

L_Heure := 25 ; L_Heure := 24 ;

sont des écritures incorrectes (« not in range » dit le compilateur !) car les valeurs littérales admises vont de 0 à 23 d’après la définition ci dessus (mod 24). Donc 24 et 25 ne sont pas dans l’intervalle.

Mais :

L_Heure := -2 ;

est une écriture correcte car le – ne fait pas partie de la définition c’est un opérateur unaire ! C’est équivalent à : L_Heure := 0 - 2 ;

L’écriture est aussi équivalente à L_Heure := 22 ; il faut revoir les exercices du cours précédent !

Les types énumératifs construits :

La règle de construction d’un type énumératif est régit par le D.S. :

type identificateur is ( énumération ) ;

Exemples :

type T_COCORICO is (BLEU, BLANC, ROUGE) ;

type T_COULEUR is (VIOLET, INDIGO, BLEU, VERT, JAUNE, ORANGE, ROUGE) ; type T_FEUX is (VERT, ORANGE, ROUGE);

type T_JOUR is (LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE); type T_MOIS is (JANVIER, FEVRIER, MARS, AVRIL, MAI, JUIN, JUILLET, AOUT,

 D. Feneuille I.U.T 2001 (cours n°2 fichier COURS2.DOC) 30/06/02

5

Les types énumératifs sont construits en indiquant (en énumérant !) simplement les valeurs symboliques (séparées par des virgules) que peuvent prendre leurs instances (à ne pas confondre avec les littéraux chaînes de

caractères : le symbole ou identificateur BLEU est différent du littéral chaîne ″BLEU″).

On remarque (dans les exemples) la présence du symbole énumératif (ou littéral énumératif) ROUGE à trois endroits. On parle de surcharge. (Même remarque pour ORANGE, BLEU et VERT il y a encore surcharge). Comme pour les types construits ou prédéfinis vus précédemment, le type énumératif possède des attributs. T_COCORICO’PRED(ROUGE) vaut BLANC

T_COULEUR’PRED(ROUGE) vaut ORANGE sans ambiguïté!

L’attribut PRED, qui opère bien sur la valeur ROUGE, doit être qualifié par le type (ceci est vrai quelle que soit l’utilisation et pas seulement comme ici en cas de surcharge). Attention T_COCORICO’PRED(BLEU)entraîne une erreur d’exécution dite CONSTRAINT_ERROR. (A revoir en TD mais on comprend pourquoi !).

T_JOUR’FIRST vaut LUNDI T_FEUX’LAST vaut ROUGE

S’il existe une procédure ECRIRE elle même surchargée (pour les trois types) il y a ambiguïté à écrire : ECRIRE (ROUGE); Il faut qualifier par exemple ainsi : ECRIRE (T_COULEUR’(ROUGE)); Les déclarations des variables (ou instanciation des types) sont semblables à celles déjà étudiées :

DEBUT_SEMAINE, DEBUT_WEEK_END : T_JOUR; PEINTURE : T_COULEUR;

Une variable pourra prendre une quelconque des valeurs du type. Par exemple : DEBUT_SEMAINE := LUNDI;

Les symboles qui dénotent les littéraux des types énumératifs sont des identificateurs comme les autres. On peut aussi, dans u n type énumératif, mêler les caractères (et seulement cela) et les symboles

type T_REPONSE is (OUI, NON, ‘1’, ‘A’, AUTRE); -- pas facile! à revoir

Un type énumératif est ordonné, par exemple pour le type T_COULEUR on aura les relations VERT < JAUNE < ORANGE < ROUGE

L’ordre est induit par celui de l’énumération.

Parmi les attributs définis sur ces types, IMAGE permet de convertir un symbole de type énumératif en la chaîne de caractères associée et VALUE est l’opération réciproque.

T_COULEUR'VALUE("ROUGE")sera l'identificateur ROUGE

T_COULEUR'IMAGE(ROUGE) sera la chaîne de caractères "ROUGE" Autres exemples d'attributs :

T_COULEUR'FIRST sera le symbole VIOLET

T_COULEUR'SUCC (ORANGE) sera le symbole ROUGE T_COULEUR'PRED (ORANGE) sera le symbole JAUNE T_FEUX'PRED (ORANGE) sera le symbole VERT T_COULEUR'POS (BLEU) sera la valeur entière 2 T_COULEUR'VAL (0) sera le symbole VIOLET

 D. Feneuille I.U.T 2001 (cours n°2 fichier COURS2.DOC) 30/06/02

6

Attention le rang (POS) du premier élément d’un énumératif est égal à 0. Par contre l'attribut POS sur un type (ou

un sous type) entier est l'opérateur « identité » ⇒ INTEGER'POS (L_ENTIER) est égale à la valeur de la variable L_ENTIER. Exemple : INTEGER’POS(-5) vaut -5. A retenir!

Rappel : les types prédéfinis CHARACTER et BOOLEAN sont en fait des t ypes énumératifs. Ainsi :

CHARACTER'POS('A') = 65 et CHARACTER'VAL(65) = 'A'

Les types discrets : (il s’agit de la réunion des types entiers et énumératifs)

les types entiers (type prédéfini (INTEGER par exemple) et les types entiers construits) les types énumératifs (type prédéfini (comme BOOLEAN ou CHARACTER) et construits)

Les types scalaires : Il s’agit de la réunion des types discrets et des types réels.

Ce type scalaire est caractérisé par les 4 propriétés suivantes (notez donc que ces 4 propriétés s’appliquent à tous les types discrets vus précédemment) :

• Pour ce type sont définies l'affectation et les opérations d'égalité et d'inégalité (= et /= ). Ce sont les propriétés communes de tout type dit à « affectation ».

• Une relation d'ordre est définie entre les diverses valeurs possibles. On dispose donc en plus :

• des 4 opérateurs de relation : <, >, <=, >=

des tests d'appartenance à un intervalle ou à un sous type : in et not in

• Les types scalaires possèdent une borne inférieure et une borne supérieure que l'on peut connaître par les attributs FIRST et LAST. Exemples : INTEGER'FIRST et INTEGER'LAST ou FLOAT’FIRST et FLOAT’LAST (dans ce cas ces valeurs dépendent de l’implémentation numérique).

Des contraintes d'intervalle (avec range) peuvent être appliquées sur les types scalaires.

Différence : les attributs vus avec les types discrets (ci dessous) s’appliquent aussi aux types scalaires sauf deux : VAL et POS. En effet avec les types discrets chaque valeur possède un rang, avec les types réels , la

notion de rang n'existe pas.

Donc ni VAL ni POS avec les réels (seule différence à retenir).

Les types scalaires donc aussi les types discrets ont (entre autres) les propriétés suivantes : toute valeur d'un type scalaire ou discret, sauf la dernière, possède un successeur, SUCC toute valeur d'un type scalaire ou discret, sauf la première, possède un prédécesseur, PRED toute valeur (VAL) d'un type discret possède un rang (POS). Spécifique aux types discrets (rappel).

Résumé :

Les attributs Ada associés aux types scalaires et discrets sont (vus en TD semaines 3 et 4):

WIDTH POS(*) VAL(*) SUCC MAX

PRED IMAGE VALUE BASE MIN

FIRST LAST ADDRESS SIZE

 D. Feneuille I.U.T 2001 (cours n°2 fichier COURS2.DOC) 30/06/02

7

Documents relatifs