2017-04-01 16 views
1

キーボードからの入力を読み込んでいます。入力は、列挙型で定義されている要素の1つと一致するはずです。Ada:入力が列挙型かどうかを確認する方法

type NameType is (Bob, Jamie, Steve); 

これらの3つ以外の入力を受け取った場合、adaはIO例外を発生させます。これをどうやって「再試行」メッセージを表示し、プログラムを停止させることができないのかをどのように扱うのですか?感謝

答えて

4

から例を含めるName_TypeためEnumeration_IOのインスタンスを作成し、Name_IOを言います。 loopには、Data_Errorが処理されるようにネストされたblockを入力します。 Name_IO.Getが成功すると、exitloopが成功します。

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

あなたはNameTypeの変数に値を取得するためにチェックされていない変換を試み、その変数でvalidを呼び出します。

編集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

あなたは真剣にこれを試すと間違います。いずれにしても、「価値」が最初のものは何ですか?整数。文字列?自分で試してみることをお勧めします! –

+0

これは通常、シリアルカードから任意のデータを読み取る方法です。その後、バッファから型付き構造体への変換をチェックしません。次に、有効な構造体の各要素をチェックします。もっと良い方法があれば、私たちを啓発することができますか?上記の答えは、プログラム入力の通常の行為としての例外に依存していることがわかります。賢明に見えません。 – Derek

+0

与えられた解決法の両方に欠陥があります。最初の例で数値を試しても、プログラムは例外のテキストを永遠に出力し続けます。非数値入力が表示されている場合、私が与える例は例外をスローします。 – Derek

関連する問題