2017-04-01 110 views
1

我正在從鍵盤讀取輸入。輸入應該與枚舉類型中定義的元素之一匹配。下面是枚舉類型的示例:Ada:如何檢查輸入是否枚舉類型

type NameType is (Bob, Jamie, Steve); 

如果我接收輸入不是這些3中的一個,ADA引發IO異常。我如何處理這個問題,以便我可以簡單地顯示「再試一次」的信息,而不是讓程序停止?感謝

回答

4

的例子爲Name_Type創建的Enumeration_IO一個實例,說Name_IO。在loop中,輸入一個嵌套的block來處理出現的任何Data_Error。當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的變量,然後調用對該變量有效的值。

編輯包括來自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