2013-10-28 40 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