2011-12-10 25 views
8

La siguiente línea de código fuente en Ada,Acerca de "gama" en Ada

type Airplane_ID is range 1..10; 

, puede escribirse como

type Airplane_ID is range 1..x; 

, donde x es una variable? Pregunto esto porque quiero saber si el valor de x puede modificarse, por ejemplo, mediante el ingreso de texto. Gracias por adelantado.

Respuesta

3

No. Una declaración de rango Ada debe ser constante.

+0

Muchas gracias. –

9

No, los límites del rango ambos tienen que ser expresiones estáticas.

Pero se puede declarar un subtipo con límites dinámicos:

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

Muchas gracias. Pero en el ejemplo que pones, el valor de X se puede modificar mediante el ingreso de texto, o debe ser constante. –

+2

Los límites en una declaración de subtipo pueden ser expresiones arbitrarias, siempre que sean del tipo apropiado. –

+0

@ La respuesta de Shark8 es un buen punto. Cuando declara 'Dynamic_Subtype' como se indica arriba,' X' se evalúa cuando se evalúa la declaración. La modificación de 'X' más tarde no afecta el subtipo. –

3

Puede escribirse type Airplane_ID is range 1..x; donde x es una variable ? Pregunto esto porque quiero saber si el valor de x puede ser modificado, por ejemplo a través de la entrada de texto.

Supongo que quiere decir que al alterar el valor de x se altera el rango en sí mismo en un estilo dinámico; si es así, estrictamente hablando, no ... pero esa no es toda la respuesta.

Usted puede hacer algo como esto:

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 lo anterior, puede tener Test_type establecido en el rango apropiado mediante el parámetro X. – Shark8

0

Como han mencionado las otras respuestas, se puede declarar rangos en la forma que desee, siempre y cuando se declaran en algún tipo de bloqueo - un 'declare 'bloque, o un procedimiento o función; por ejemplo:

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;