2013-01-21 11 views
5

Un ciclo for può essere fatto in Ada utilizzando un intervallo con un inizio e un punto finale:Che tipo ha una variabile contenente un intervallo?

for I in 0..10 loop 
(...) 
end loop; 

so, è possibile fare il ciclo for utilizzando due variabili che descrivono la gamma:

for I in range_start..range_end loop 
(...) 
end loop; 

E 'anche possibile memorizzare la gamma in uno variabile ?, come:

for I in my_range loop 
(...) 
end loop; 

Quale tipo ha la variabile * my_range *?

Modifica: Diciamo che voglio usare questa variabile come parametro in un sottoprogramma: Quindi il sottoprogramma ha questo ciclo che scorre sull'intervallo. Preferisco usare due variabili che descrivono l'intervallo invece di usare i generici, perché i generici causerebbero uno sforzo maggiore. Ma penso che l'utilizzo di una variabile che descrive l'intervallo causerebbe una maggiore leggibilità, ecco perché sto facendo questa domanda.

risposta

2

utilizzare un tipo range, qualcosa in questo senso:

type Range_Type is range -5 .. 10; 
... 
for A in Range_Type loop 

vedere l'esempio completo in here.

+0

Ma se mi piacerebbe utilizzare l'intervallo come parametro per un sottoprogramma, ho dovuto usare i generici, giusto?Quindi penso che questa soluzione renda più complicato che usare due variabili ... – clx

+0

Un intervallo è un tipo come un altro, si passa lungo l'intervallo o si passano lungo i due punti e si crea l'intervallo dove necessario –

3

Se la variabile è un array, allora si può iterare la propria gamma attraverso:

for I in Arr_Var'Range loop 
    ... 
end loop; 

Se siete interessati a iterare sugli elementi di un container, ad esempio, array, vector, carta, ecc, e non si preoccupano l'indice, è possibile utilizzare generalized looping (Ada 2012 solo):

for Elem of Container loop 
    ... 
end loop; 
+0

La variabile non è un array. Ma potrei usare una serie fittizia per la gamma, giusto? – clx

+0

Beh, si potrebbe, ma avere un array fasullo solo per quello sarebbe altamente scoraggiato. Ho modificato la mia risposta per aggiungere un breve esempio su come eseguire questa operazione con gli attributi Primo e Ultimo se la variabile è di tipo discreto. –

+0

@Marc, ''First' e'' Last' non possono essere applicati a variabili semplici - solo [matrici e (sotto) tipi] (http://www.ada-auth.org/standards/12rm/html/ RM-K-2.html # p66). –

1

Hmmm. Sembra che tu possa essere (forse inconsapevolmente) un devoto di Andrei Alexandrescu. Ha sostenuto con forza che le lingue rendessero gli intervalli un tipo di prima classe e la rimozione degli "iteratori" come paradigma di programmazione.

Sarebbe interessante vedere come sarebbe l'implementazione di Ada. A meno che mi manchi qualcosa, non è così che è andata Ada 2012.

+0

Il concetto di Andrei Alexandrescu sembra davvero interessante! – clx

1

Se si desidera passare attorno a un oggetto contenente l'intervallo, è possibile eseguire il wrapping Inizio e Fine in un record. All'interno del sottoprogramma è possibile dichiarare localmente un nuovo [sub] tipo delimitato dall'intervallo.

type Range_Type is range TheRange.Start .. TheRange.end; 
+0

Questo deve essere più difficile che creare un generico! –

+0

@Simon: +1 e vero. Penso di essere scivolato inconsciamente nel VHDL, dove i farmaci generici sono più restrittivi. Il disco sarebbe almeno portatile a VHDL ... –

1

mio conteggio dice che avete bisogno di più 4 linee per creare un sottoprogramma generica di una piana:

generic        -- extra 
    type Bounds is (<>);    -- extra 
procedure R; 

procedure R is 
begin 
    for J in Bounds'Range loop 
     null; 
    end loop; 
end R; 

with R; 
procedure P is 
    type Rng is range 1 .. 10;  -- extra 
    procedure A is new R (Rng);  -- extra 
begin 
    A; 
end P; 

che non sembra poi così male.

Ma, di solito un'iterazione è iterazione di qualcosa (un array, ...): in tal caso, è possibile derivare l'intervallo di iterazione dalla cosa che viene iterato.

Problemi correlati