2017-04-01 2 views
1

Je lis une entrée à partir du clavier. L'entrée est censée correspondre à l'un des éléments définis dans un type d'énumération. Voici un exemple du type ENUM:Ada: Comment vérifier si l'entrée est un type d'énumération

type NameType is (Bob, Jamie, Steve); 

Si je reçois une entrée qui ne sont pas l'un de ces trois, ada déclenche une exception IO. Comment puis-je gérer cela à l'endroit où je peux simplement afficher un message "réessayer" et ne pas arrêter le programme? MERCI

Répondre

4

Créer une instance de Enumeration_IO pour Name_Type, dire Name_IO. Dans un loop, entrez un block imbriqué pour gérer tout Data_Error qui se produit. Lorsque Name_IO.Get réussit, exit le loop.

with Ada.IO_Exceptions; 
with Ada.Text_IO; 

procedure Ask is 

type Name_Type is (Bob, Jamie, Steve); 
package Name_IO is new Ada.Text_IO.Enumeration_IO (Name_Type); 

begin 
    loop 
     declare 
     Name : Name_Type; 
     begin 
     Ada.Text_IO.Put("Enter a name: "); 
     Name_IO.Get(Name); 
     exit; 
     exception 
     when Ada.IO_Exceptions.Data_Error => 
      Ada.Text_IO.Put_Line("Unrecognized name; try again."); 
     end; 
    end loop; 
end Ask; 
-2

Vous pouvez essayer une conversion non cochée pour obtenir la valeur dans une variable de NameType puis appeler 'valide sur cette variable.

Modifier pour inclure l'exemple de ADAIC

with Ada.Unchecked_Conversion; 
with Ada.Text_IO; 
with Ada.Integer_Text_IO; 

procedure Test is 

    type Color is (Red, Yellow, Blue); 
    for Color'Size use Integer'Size; 

    function Integer_To_Color is 
     new Ada.Unchecked_Conversion (Source => Integer, 
            Target => Color); 

    Possible_Color : Color; 
    Number   : Integer; 

begin -- Test 

    Ada.Integer_Text_IO.Get (Number); 
    Possible_Color := Integer_To_Color (Number); 

    if Possible_Color'Valid then 
     Ada.Text_IO.Put_Line(Color'Image(Possible_Color)); 
    else 
     Ada.Text_IO.Put_Line("Number does not correspond to a color."); 
    end if; 

end Test; 
+1

Vous vous seriez sérieusement trompé pour essayer ceci. En tout cas, quelle serait la "valeur" en premier lieu? un nombre entier; un string? Je vous suggère de l'essayer vous-même! –

+0

C'est généralement ainsi que je lis des données arbitraires d'une carte série. Puis la conversion non cochée du tampon à une structure typée. Ensuite, vérifiez chaque élément de la structure avec 'valide. S'il y a un meilleur moyen, pourriez-vous nous éclairer? Je vois la réponse ci-dessus qui s'appuie sur les exceptions comme un acte normal d'entrée de programme. Cela semble imprudent. – Derek

+0

Les deux solutions ont des défauts. Si un nombre est essayé avec le premier exemple, le programme continuera à sortir le texte de l'exception, pour toujours. L'exemple que je donne jettera une exception si une entrée non numérique est présentée. – Derek