キーボードからの入力を読み込んでいます。入力は、列挙型で定義されている要素の1つと一致するはずです。Ada:入力が列挙型かどうかを確認する方法
type NameType is (Bob, Jamie, Steve);
これらの3つ以外の入力を受け取った場合、adaはIO例外を発生させます。これをどうやって「再試行」メッセージを表示し、プログラムを停止させることができないのかをどのように扱うのですか?感謝
キーボードからの入力を読み込んでいます。入力は、列挙型で定義されている要素の1つと一致するはずです。Ada:入力が列挙型かどうかを確認する方法
type NameType is (Bob, Jamie, Steve);
これらの3つ以外の入力を受け取った場合、adaはIO例外を発生させます。これをどうやって「再試行」メッセージを表示し、プログラムを停止させることができないのかをどのように扱うのですか?感謝
から例を含めるName_Type
ためEnumeration_IO
のインスタンスを作成し、Name_IO
を言います。 loop
には、Data_Error
が処理されるようにネストされたblockを入力します。 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の変数に値を取得するためにチェックされていない変換を試み、その変数で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;
あなたは真剣にこれを試すと間違います。いずれにしても、「価値」が最初のものは何ですか?整数。文字列?自分で試してみることをお勧めします! –
これは通常、シリアルカードから任意のデータを読み取る方法です。その後、バッファから型付き構造体への変換をチェックしません。次に、有効な構造体の各要素をチェックします。もっと良い方法があれば、私たちを啓発することができますか?上記の答えは、プログラム入力の通常の行為としての例外に依存していることがわかります。賢明に見えません。 – Derek
与えられた解決法の両方に欠陥があります。最初の例で数値を試しても、プログラムは例外のテキストを永遠に出力し続けます。非数値入力が表示されている場合、私が与える例は例外をスローします。 – Derek