2011-12-10 10 views
8

La fonte seguente riga di codice in Ada,A proposito di "range" di Ada

type Airplane_ID is range 1..10; 

, può essere scritta come

type Airplane_ID is range 1..x; 

, dove x è una variabile? Lo chiedo perché voglio sapere se il valore di x può essere modificato, ad esempio attraverso l'input di testo. Grazie in anticipo.

risposta

3

No. Una dichiarazione di intervallo di Ada deve essere costante.

+0

Grazie mille. –

9

No, i limiti dell'intervallo devono essere entrambi espressioni statiche.

Ma si può dichiarare un sottotipo con limiti dinamici:

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

Grazie mille. Ma nell'esempio che hai inserito, il valore di X può essere modificato tramite l'input di testo, o dovrebbe essere costante? –

+2

I limiti di una dichiarazione di sottotipo possono essere espressioni arbitrarie, purché siano del tipo appropriato. –

+0

@ La risposta di Shark8 è un buon punto. Quando dichiari 'Dynamic_Subtype' come sopra,' X' viene valutato quando viene valutata la dichiarazione. La modifica di 'X' in seguito non ha alcun effetto sul sottotipo. –

3

Può essere scritto type Airplane_ID is range 1..x; dove x è una variabile ? Lo chiedo perché voglio sapere se il valore di x può essere modificato , ad esempio tramite l'immissione di testo.

Presumo che si intenda tale che l'alterazione del valore di x altera l'intervallo stesso in un tipo dinamico di stile; se è così, a rigor di termini, no ... ma non è proprio l'intera risposta.

Si può fare qualcosa di simile:

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

Con quanto sopra è possibile impostare Test_type sull'intervallo appropriato tramite il parametro X. – Shark8

0

Come le altre risposte hanno detto, è possibile dichiarare gamme nel modo desiderato, purché siano dichiarati in una sorta di blocco - un 'declare 'blocco, o una procedura o funzione; per esempio:

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;