Pour déclarer une variable, il faut être à un endroit où on a le droit de déclarer des variables, typiquement juste après leisde définition d'une fonction. Si on veut déclarer une variable à un autre endroit, il existe une autre méthode : on peut remplacer une instruction par un bloc.
declare declaration de variables begin liste d'instructions pour laquelle la variable existe end;
Ceci déclare de nouvelles variables valides uniquement pour les instructions situées entre lebeginet leend;. Après leend;, les variables déclarées entre ledeclareet lebeginn'existent plus.
Une déclaration de variable suit le schéma suivant :
nom_de_la_variable : [constant] type_de_la_variable [:= valeur_initiale];
La valeur initiale est facultative. Si cette variable ne change jamais, il est conseillé (avec certaines options de compilation, il est même obligatoire) de la noterconstant. Si on veut déclarer plusieurs variables du même type, on peut les regrouper :
variable1, variable2 [...] : [constant] type_des_variables [:= valeur_initiale];
En Ada, on peut faire des types très contraints, comme par exemple, les entiers pairs entre 10 et 50. On reviendra sur ce point plus tard. Les types de bases sont
Booleanavec deux valeurs:trueetfalse,
Integerpour les entiers,
Floatpour les réels,
Characterpour les caractères,
Stringpour les chaînes de caractères.
Il existe plusieurs façons de noter un entier en Ada, par exemple :
e1 : Integer := 1E6; e2 : Integer := 1_000_0_00; e3 : Integer := 16#12AB#;
On peut naturellement écrire l'entier tel quel. Pour améliorer la lisibilité, on peut aussi mettre le caractère_n'importe où pour séparer différents groupes de chiffres (dans l'exemple ci-dessus, la lisibilité n'est pas vraiment meilleure, c'est juste pour montrer qu'on peut mettre un_n'importe où). On peut aussi utiliser la notationbase#nombre#pour spécifier un nombre dans une base autre que le décimal. La notationnombreEexposantdésigne le nombrenombre*base^exposantavecbase=10 par défaut.
Le typeStringd'Ada est très différent des "classes"stringque l'on rencontre en C++ ou Java, il se rapproche plus du typechar[]. En effet une chaîne a une taille fixe qui ne peut pas changer. Par exemple:
procedure taille_string is s : String := "coucou"; begin s := "test"; -- Ceci ne compile pas end;
échoue à la compilation avec un message du genre
taille_string:4:09: warning: wrong length for array of subtype of "Standard.String" defined at line 2.
En effet, la ligne 2 déclare une chaîne de caractères de taille 6, on ne peut donc pas lui affecter une chaîne de caractères de taille 4 comme"test". Pour déclarer une chaîne sans l'initialiser, on utilise la syntaxe
nom_de_la_variable : String(indice_du_premier_element..indice_du_dernier_element);
Voici un petit exemple de programme avec une "variable" :
with Text_IO; use Text_IO; procedure put_var is begin Put("Veuillez entrer votre nom: "); declare name : constant String := Get_Line; begin Put("Bonjour "); Put_Line(name); end; end put_var;
Dans ce programme,Get_Linelit une ligne entrée au clavier. Ici, on ne connaît pas à l'avance la taille de la chaîne de caractèresname. On ne peut donc pas la déclarer avant de la connaître, c'est pourquoi on utilise un blocdeclare ... begin ... end
Comme on peut s'en douter en regardant la façon dont on donne une valeur initiale à une variable, l'affectation se fait grâce au symbole ":=". Pour donner une valeur à une variable, on utilise une instruction du genre :
nom_de_la_variable := expression_donnant_la_nouvelle_valeur;