2013-10-28 36 views
0

我在阿达编程初学者,我有以下代码:验证用户输入的内容

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

此过程要求您输入的东西,把它放在我的“变量”变量(类型为包含的myType从'1'到'3'的字符)。

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

现在我想在输入为'm'时做其他事情。

我该怎么做?

回答

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',但也需要处理其他输入。

+0

好吧我明白了,但是就像你说的it's不是一个良好的编程风格。所以我会重新考虑我的程序。 – user2302725

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; 
2

变化myType声明:

type myType is ('1', '2', '3', 'm'); 
+0

这不适用于'Ada.Text_IO.Get',你必须使用'Character'中的'Ada.Unchecked_Conversion'这种类型或使用更强大的I/O包之一。 – flyx

+1

'Ada.Unchecked_Conversion'会导致很多悲伤,除非'myType'上也有表示子句。如果没有rep子句,它会将ASCII.NUL转换为'1',将ASCII.SOH转换为'2'等,并将实际的'1','2','3','m'字符转换为无效值。事实上,'Ada.Unchecked_Conversion'不会做任何检查(惊喜!),所以即使使用rep子句,如果输入了无效字符(尽管可以使用“Valid”),将会是一个大问题。 'ada.Text_IO.Enumeration_IO'(在'myType'上)会期望枚举周围的单引号,所以这是行不通的。 – ajb