Bonsoir|x|Bonjour,
Je finalise un programme qui demande un nom puis si le nom est valide à celui attendu, alors demande un mot de passe. Mais si le nom n'est pas celui attendu alors une deuxiéme saisie est demandée (de type float), puis si celle-ci est valide alors un avertissement est affiché et fin du programme.
J'ai utilisé l'attribut 'Valid mais celui-ci fonctionne mal.
En effet d'aprés l'ARM (je cite) :
Invalid data can be created in the following cases (not counting erroneous or unpredictable execution): - input.
Source de ma citation :http://www.adaic.org/resources/add_c...AA-13-9-2.html
Donc (pour les non-anglophones ) : Quel outil utiliser au lieu de " 'Valid " (par exemple : un autre attribut ?) qui me permettrai de valider une entrée conforme au type attendu et d'agir en conséquence?
Bon, tréve de texte , place au code !
Je fais de mon mieux pour commenter et rendre mon code lisible alors si vous ne comprenez toujours pas , critiquez pour que je fasse quelques modifs.
Le code se construit avec Gnat GPL , je ne sais pas pour les autres compilateurs .
Bien entendu ,pour que le code se construit , enregistrer les fichiers dans le même dossier.
Construisez-le et exécutez-le pour une meilleure compréhension .
Enfin : Le code est commenté par moi et quelques warnings
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 with Ada.Text_IO; with Identification; use Identification; -- Nom du fichier : log_in.adb (fichier principal à compiler) Procedure log_in is begin virgules_et_passe; declare virgules : Identification.virgules_Value; Password : Identification.Password_Value; -- warning: variable "Password" is read but never assigned -- Moi : Euh, pourtant elle est bien utilisée juste en dessous ! begin if virgules'Valid then -- Ici 'valid fonctionne mal , comme vous avez pu le constater si vous avez lancer le programme en utilisant le nom et le mot de passe requis dans Identification.adb . Ada.Text_IO.Put_Line("A float number was not asked"); elsif Password = "admin" then Ada.Text_IO.Put_Line (Item => "Welcome, Administrator."); -- Lors de l'éxécution , cette condition est ignorée !! Pourquoi ?! end if; end; end log_in;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 with Ada.Text_IO; use Ada.Text_IO; with Ada.Float_Text_IO; -- Nom du fichier : identification.adb package body Identification is procedure Passe (Password : out Password_Value) is begin Ada.Text_IO.Get (Password); Ada.Text_IO.Skip_Line; Ada.Text_IO.New_Line; end Passe; procedure Get_virgules (virgules : out virgules_Value) is begin Ada.Float_Text_IO.Get (virgules); Ada.Text_IO.Skip_Line; end Get_virgules; procedure virgules_et_passe is virgules : Identification.virgules_Value; Password : Identification.Password_Value; begin Ada.Text_IO.Put (Item => "Hello, User. What's your name? "); declare Name : String := Ada.Text_IO.Get_Line; begin if Name = "codezero1" then Passe (Password => Password); else Ada.Text_IO.Put_Line ("You're not Administrator."); Get_virgules (virgules => virgules); end if; end; end virgules_et_passe; end identification;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 with Ada.Text_IO; with Ada.float_text_IO; -- Nom du fichier : identification.ads package identification is subtype virgules_Value is float; procedure Get_virgules (virgules : out virgules_Value); ---------------------------------------------------------------------------------------------- subtype Password_Value is String(1..5); procedure Passe (Password : out Password_Value); procedure virgules_et_passe; end identification;
Partager