我正在從鍵盤讀取輸入。輸入應該與枚舉類型中定義的元素之一匹配。下面是枚舉類型的示例:Ada:如何檢查輸入是否枚舉類型
type NameType is (Bob, Jamie, Steve);
如果我接收輸入不是這些3中的一個,ADA引發IO異常。我如何處理這個問題,以便我可以簡單地顯示「再試一次」的信息,而不是讓程序停止?感謝
我正在從鍵盤讀取輸入。輸入應該與枚舉類型中定義的元素之一匹配。下面是枚舉類型的示例:Ada:如何檢查輸入是否枚舉類型
type NameType is (Bob, Jamie, Steve);
如果我接收輸入不是這些3中的一個,ADA引發IO異常。我如何處理這個問題,以便我可以簡單地顯示「再試一次」的信息,而不是讓程序停止?感謝
的例子爲Name_Type
創建的Enumeration_IO
一個實例,說Name_IO
。在loop
中,輸入一個嵌套的block來處理出現的任何Data_Error
。當Name_IO.Get
成功時,exit
的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;
您可能會嘗試進行未經檢查的轉換以將值轉換爲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;
你會嚴重誤會嘗試這個。無論如何,「價值」究竟是什麼?一個整數;一個字符串?我建議你自己試試這個! –
這通常是我如何從串行卡讀取任意數據。然後取消選中將其從緩衝區轉換爲類型化結構。然後用「有效」檢查結構中的每個元素。如果有更好的方法可以啓發我們嗎?我看到上面的答案依賴於例外作爲程序輸入的正常行爲。似乎是不明智的。 – Derek
這兩種給定的解決方案都有缺陷。如果在第一個例子中嘗試了一個數字,那麼該程序會一直輸出該例外的文本。如果給出非數值輸入,我給出的示例將拋出異常。 – Derek