0

我是 Ada 编程的初学者,我有以下代码:

PROCEDURE ask(variable: OUT myType) IS
BEGIN
   Put("Enter : ");
   Get(variable);
   Skip_Line;
EXCEPTION
   WHEN OTHERS => RAISE wrongInput;
END ask;

此过程要求输入一些内容并将其放入我的“变量”变量中(类型为 myType,包含从 '1' 到 '3' 的字符)。

当输入不正确时,我会引发异常。

现在,例如,当输入为“m”时,我想做其他事情。

我怎么能这样做?

4

3 回答 3

2

更改声明myType

type myType is ('1', '2', '3', 'm');
于 2013-10-28T18:29:23.403 回答
1

这个答案是基于myType声明为类似的假设

subtype myType is Character range '1' .. '3';

您可以将输出写入无约束Character变量,然后检查它:

PROCEDURE ask (variable : OUT myType) IS
   Input : Character;
BEGIN
   Put ("Enter : ");
   Get (Input);
   Skip_Line;
   CASE Input IS
      WHEN 'm' =>
         RAISE gotM;
      WHEN OTHERS =>
         -- this will raise Constraint_Error if the value is not
         -- in range '1' .. '3'
         variable := Input;
   END CASE;
EXCEPTION
   WHEN OTHERS => RAISE wrongInput;
END ask;

我用case了而不是简单的if,因为听起来将来可能会添加其他输入值。现在虽然这在技术上是可行的,但我认为这是一种不好的风格,因为它使用异常gotM来实现非异常行为。你应该重新考虑你的代码布局,这样你就没有一个ask只能返回'1' .. '3'但也需要处理其他输入的过程。

于 2013-10-28T14:09:14.237 回答
1

大概是这样的吧?(只是在这里猜测,“我想做点别的”是非常模糊的)。

procedure Ask (Variable : out My_Type) is
begin
   loop
      begin
         Put ("Enter :");
         Get (Variable);
         Skip_Line;
         return;
      exception
         when others =>
            Skip_Line;
            Put_Line ("invalid.");
      end;
   end loop;
end Ask;
于 2013-10-28T15:28:48.220 回答