2011-12-10 94 views
8

在阿達下面的源代碼行 「範圍」,關於在阿達

type Airplane_ID is range 1..10; 

,可以寫爲

type Airplane_ID is range 1..x; 

,其中x是變量?我問這是因爲我想知道x的值是否可以修改,例如通過文本輸入。提前致謝。

回答

3

否。一個Ada範圍聲明必須是常量。

+0

非常感謝。 –

9

不,範圍的邊界都必須是靜態表達式。

但是你可以聲明動態範圍的子類型:

X: Integer := some_value; 
subtype Dynamic_Subtype is Integer range 1 .. X; 
+0

非常感謝。但是在你所舉的例子中,X的值可以通過文本輸入來修改,或者它應該是常量? –

+2

子類型聲明中的邊界可以是任意的表達式,只要它們是適當的類型即可。 –

+0

@ Shark8的回答很好。當你像上面那樣聲明'Dynamic_Subtype'時,'X'在評估聲明時被評估。稍後修改'X'不會影響子類型。 –

3

可以type Airplane_ID is range 1..x;被寫入其中x是 變量?我問這是因爲我想知道x的值是否可以修改爲 ,例如通過文本輸入。

我認爲你的意思是改變x的值會改變範圍本身的動態排序風格;如果是這樣,那麼嚴格來說,不......但這不完全是答案。

你可以做這樣的事情:

Procedure Test(X: In Positive; Sum: Out Natural) is 
    subtype Test_type is Natural Range 1..X; 
    Result : Natural:= Natural'First; 
begin 
    For Index in Test_type'range loop 
    Result:= Result + Index; 
    end loop; 

    Sum:= Result; 
end Test; 
+0

使用上面的代碼,可以通過X參數將Test_type設置爲合適的範圍。 – Shark8

0

至於其他的答案已經提到的,你可以在你想要的方式申報的範圍,只要在聲明中某種塊 - 一個「聲明'阻止或程序或功能;例如:

with Ada.Text_IO,Ada.Integer_Text_IO; 
use Ada.Text_IO,Ada.Integer_Text_IO; 

procedure P is 
    l : Positive; 
begin 
    Put("l ="); 
    Get(l); 
    declare 
     type R is new Integer range 1 .. l; 
     i : R; 
    begin 
     i := R'First; 
     -- and so on 
    end; 
end P;