Memento ADA
Transcription
Memento ADA
Université Joseph Fourier UE INF234 DLST Année 2015/2016 Mémento ADA Mots-clés, identificateurs et noms des fichiers ADA Les mots-clés du langage ADA (ne pouvant pas être utilisés comme identificateurs) sont : abort abs abstract accept access aliased all and array at begin body case constant declare delay delta digits do else elsif end entry exception exit for function generic goto if in interface is limited loop mod new not null of or others out overriding package pragma private procedure protected raise range record rem renames raise range record rem renames requeue return reverse select separate some subtype synchronised tagged task terminate then type until use when while with xor Les identificateurs suivants représentent des noms de types et variables standards en ADA boolean true false integer natural positive short_short_integer short_integer long_long_integer long_integer float short_float long_float long_long_float duration character wide_character string wide_string constraint_error program_error storage_error tasking_error Un identificateur (nom de variable, de type, de fonction, de procédure, de paquetage) est une chaı̂ne de caractères composée de lettres, éventuellement de caractères souligné , de chiffres. Le premier caractère est une lettre, deux caractères ne peuvent être consécutifs et le dernier caractère ne peut pas être Le langage ADA ne distingue pas majuscule et minuscule. Le nom d’un fichier (sans l’extension .ads ou .adb) doit correspondre au nom du paquetage ou de la procédure principale mais sans utiliser de lettres majuscules. L’extension .adb est utilisée pour le corps d’un paquetage ou d’une procédure principale. L’extension .ads est utilisée pour la spécification d’un paquetage. Opérateurs Les opérateurs suivants sont triés par ordre décroissant de priorité : 1) 2) 3) 4) 5) 6) ** not abs puissance négation valeur absolue * / mod rem multiplication division modulo reste + - signe plus signe moins + - & addition soustraction concaténation = <= >= /= < > égal à inférieur ou égal supérieur ou égal différent de inférieur strict supérieur strict and or xor et ou ou exclusif Dans une expression, les opérateurs de même priorité sont évalués de gauche à droite. Utiliser les parenthèses ( ) pour effectuer une opération en priorité ou en cas de doute sur une priorité. Opérateurs booléens conditionnels Il existe deux opérateurs booléens conditionnels, pour chacun le second opérande est évalué si et seulement si le premier a une certaine valeur. exp1 and then exp2 exp2 est évaluée si et seulement si exp1 est vrai Exemple : i<=10 and then T(i)/=0 exp1 or else exp2 exp2 est évaluée si et seulement si exp1 est faux Exemple : b==0 or else a/b > 1 Lecture et écriture de “fichiers texte” depuis un programme ADA Dans la terminologie Ada un fichier texte est un fichier de caractères auquel on accède de manière séquentielle. Des procédures et fonctions d’accès sont fournies par des paquetages prédéfinis comme Ada.Text IO, Ada.Integer Text IO ou Ada.Float Text IO. Notons que les périphériques d’entrée-sortie “standard” (comme le clavier et l’écran) sont considérés comme des fichiers texte particuliers. Nous décrivons ci-dessous certaines procédures et fonctions d’accès à des fichiers texte. Toute opération d’entrée/sortie sur un fichier consiste en : 1) l’ouverture du fichier, 2) des opérations de lecture / écriture dans le fichier, 3) la fermeture du fichier. Pour lire au clavier ou écrire à l’écran, on utilise les procédures et fonctions d’accès de la partie 2) en omettant le premier paramètre. Différentes erreurs peuvent se produire lors de l’exécution des procédures et fonctions suivantes (par exemple un fichier externe inexistant ou impossible à créer, une valeur impossible à lire, . . .). Lorsque de telles erreurs se produisent des exceptions particulières sont levées. • • • 1) Ouverture de fichiers Comme beaucoup de langages, Ada distingue : – le fichier externe, stocké par exemple sur le disque dur de la machine, et que l’on connait par son nom (une chaı̂ne de caractères) ; – le descripteur interne, qui est une structure de données manipulée par le programme Ada et dont le type (privé) est File Type. Ouvrir un fichier depuis un programme Ada revient donc à associer un descripteur interne à un fichier externe. Cela peut se faire par exemple avec les primitives (simplifiées) suivantes : procedure Create (File : in out File Type; Mode : in File Mode; Name : in String); Cette procédure crée un fichier externe de nom Name et lui associe le descripteur interne File. Le Mode est Out File pour permettre un accès ultérieur en écriture. Si le fichier externe existait déjà, il est écrasé. procedure Open (File : in out File Type; Mode : in File Mode; Name : in String); Cette procédure ouvre un fichier externe (supposé exister) de nom Name et lui associe le descripteur interne File. Le Mode est In File pour permettre un accès ultérieur en lecture. En général, on utilise Open pour lire un fichier (existant) et Create pour écrire un (nouveau) fichier (s’il existe déjà, il est écrasé). Ces procédures sont définies dans le paquetage Ada.Text IO. • • • Lorsqu’un fichier a été ouvert en mode In File (respectivement Out File) il est possible d’y effectuer des opérations de lecture (respectivement d’écriture). 2-a) Opérations de lecture / écriture de caractères On peut lire (resp. écrire) un fichier texte caractère par caractère. procedure Get(File : in File Type; Item : out Character); Cette procédure permet de lire le prochain caractère dans le fichier associé au descripteur File et de le mémoriser dans Item, les caractères de fin-de-ligne sont ignorés. procedure Skip line(File : in File Type); Cette procédure permet d’avancer dans le fichier associé au descripteur File jusqu’au premier caractère suivant un caractère fin-de-ligne. procedure Put(File : in File Type; Item : in Character); Cette procédure permet d’écrire le caractère Item en séquence dans le fichier associé au descripteur File. procedure New Line(File : in File Type); Cette procédure permet d’écrire un caractère fin-de-ligne en séquence dans le fichier associé au descripteur File. Ces procédures sont définies dans le paquetage Ada.Text IO. 2-b) Opérations de lecture / écriture de chaı̂nes de caractères On peut lire (resp. écrire) un fichier texte ligne par ligne. procedure Get Line(File : in File Type; Item : out String; Last : out Natural); Cette procédure permet de lire la chaı̂ne de caractère terminée par le prochain caractère fin-de-ligne dans le fichier associé au descripteur File et de la mémoriser dans Item. L’entier Last indique le nombre de caractères lus. Item doit avoir une taille suffisante (sinon une exception sera levée). Remarque : après l’exécution de l’instruction Get Line, le descripteur de fichier se trouve en début de la ligne suivante. procedure Put Line(File : in File Type; Item : in String); Cette procédure permet d’écrire la chaı̂ne de caractère Item en séquence dans le fichier associé au descripteur File, suivie d’un caractère fin-de-ligne. Lors de l’appel à Put Line, il faut préciser l’intervalle d’indices de la chaı̂ne Item : par exemple Put line(fich, chaine(1..15)) . Ces procédures sont définies dans le paquetage Ada.Text IO. 2-c) Opérations de lecture / écriture d’entiers ou réels flottants procedure Get(File : in File Type; Item : out Integer); procedure Get(File : in File Type; Item : out Float); Cette procédure permet de lire le prochain entier (ou réel flottant) dans le fichier associé au descripteur File, après avoir ignoré tous les caractères espace, tabulation ou fin-de-ligne éventuels le précédant. Remarque : la présence d’un caractère invalide (caractère non numérique) produit une erreur. procedure Put(File : in File Type; Item : in Integer); procedure Put(File : in File Type; Item : in Integer; W : in Natural); Cette procédure permet d’écrire l’entier Item en séquence dans le fichier associé au descripteur File sur Width caractères (par défaut Width = 10). procedure Put(File : in File Type; Item : in Float); procedure Put(File : in File Type; Item : in Float; Fore, Aft, Exp : in Natural); Cette procédure permet d’écrire le réel flottant Item en séquence dans le fichier associé au descripteur File avec Fore caractères avant la virgule, Aft chiffres après la virgule et Exp caractères pour la partie exposant (puissance de 10) (par défaut Fore = 2, Aft = 7 et Exp = 3). Ces procédures sont définies dans le paquetage Ada.Integer Text IO pour les entiers et Ada.Float Text IO pour les réels flottants. 2-d) Opérations de test de fin de ligne ou fichier function End Of Line(File : in File Type) return Boolean; Cette fonction renvoie True si et seulement si le prochain caractère dans le fichier associé au descripteur File est un caractère fin-de-ligne. function End Of File(File : in File Type) return Boolean; Cette fonction renvoie True si la fin de fichier est atteinte. Ces fonctions sont définies dans le paquetage Ada.Text IO. • • • 3) Fermeture de fichiers Une fois les différentes opérations faites sur un descripteur interne, celui-ci doit être fermé : procedure Close(File : in out File Type); Cette procédure ferme le fichier externe associé au descripteur interne File. Cette procédure est définie dans le paquetage Ada.Text IO. Tableaux Un type tableau se définit à l’aide du mot-clé array. Les instructions suivantes montrent quelques exemples de définitions et d’utilisations de tableaux en ADA : −− t y p e t a b l e a u de r é e l s a v e c i n d i c e s ( non c o n t r a i n t s ) p o s i t i f s ou n u l s type T a b l e a u R e e l s i s array ( n a t u r a l range <>) of f l o a t ; −− t y p e s t a b l e a u x a v e c i n d i c e s c o n t r a i n t s subtype Dim i s i n t e g e r range 1 . . 1 0 0 ; −− type Tableau100 i s array (Dim) of f l o a t ; −− type Tableau7 i s array ( 0 . . 6 ) of f l o a t ; −− type T r i p l e t i s new T a b l e a u R e e l s ( 1 . . 3 ) ; −− type type type type e n t i e r c o n t r a i n t e n t r e 1 e t 100 t a b l e a u a v e c i n d i c e c o n t r a i n t e n t r e 1 e t 100 t a b l e a u avec i n d i c e c o n t r a i n t entre 0 e t 6 t a b l e a u avec i n d i c e c o n t r a i n t entre 1 e t 3 T1 , T2 , T3 : Tableau7 ; A : Tableau100 ; B : TableauReels ( 0 . . 9 9 9 9 ) ; ... −− i n i t i a l i s e r l e s v a l e u r s d ’ un t a b l e a u T1 := ( 0 . 0 , 6 . 0 , 2 . 5 , 3 . 0 , 3 . 8 , −2.62 , 1 . 8 8 e −5); T2 := ( others => 0 . 0 ) ; −− t o u s l e s é lé m e n t s égaux à 0 . 0 A := (2= >1.0 , 4= >1.0 , others = >0.0); −− l e s é l e m e n t s d ’ i n d i c e s 2 e t 4 égaux à 1 . 0 −− e t l e s a u t r e s égaux à 0 . 0 −− p a r c o u r s d e s é lé m e n t s d ’ un t a b l e a u s a n s c o n n a i t r e a p r i o r i s e s b o r n e s f o r i n d i c e in T1 ’ f i r s t . . T1 ’ l a s t loop put ( T1 ( i n d i c e ) ) ; n e w l i n e ; −− e c r i r e une v a l e u r par l i g n e end loop ; f o r k in A’ range loop put (A( k ) ) ; n e w l i n e ; −− e c r i r e une v a l e u r par l i g n e end loop ; −− c o p i e d ’ un t a b l e a u en e n t i e r ou d ’ une p a r t i e s e u l e m e n t dans un a u t r e T1 := T2 ; T3 ( 2 . . 5 ) := T1 ( 0 . . 3 ) ; −− T3( 2 ) : =T1 ( 0 ) ; T3( 3 ) : =T1 ( 1 ) ; T3( 4 ) : =T1 ( 2 ) ; T3( 5 ) : =T1 ( 3 ) ;