2013-01-21 19 views
5

pętli można zrobić w Ada przy użyciu szeregu z początku i punktu końcowego:Jaki typ ma zmienną zawierającą zakres?

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

wiem, że to możliwe robi pętli za pomocą dwóch zmiennych opisujących zakres:

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

jest to również możliwe, aby zapisać zakres w jeden zmiennej ?, jak:

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

Który typ ma zmienną * my_range *?

Edycja: Powiedzmy, że chcę użyć tej zmiennej jako parametru w podprogramie: Zatem podprogram ma tę pętlę, która iteruje w zakresie. Wolałbym używać dwóch zmiennych opisujących zakres zamiast używać generycznych, ponieważ generyczne spowodowałyby większy wysiłek. Ale myślę, że użycie jednej zmiennej opisującej zakres spowodowałoby wyższą czytelność, dlatego zadaję to pytanie.

Odpowiedz

2

Użyj range typ, coś wzdłuż tych linii:

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

Zobacz pełną przykład w here.

+0

Ale jeśli chciałbym użyć zakresu jako parametru podprogramu, musiałem użyć generycznych, prawda?Więc myślę, że to rozwiązanie czyni go bardziej skomplikowanym niż używanie dwóch zmiennych ... – clx

+0

Zasięg jest typem jak każdy inny, albo przechodzisz wzdłuż linii, albo przechodzisz wzdłuż dwóch punktów i budujesz zakres w razie potrzeby –

3

Jeśli zmienna jest tablicą, wtedy można iteracyjne nad jego zasięgu poprzez:

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

Jeśli jesteś zainteresowany iteracji po elementach kontenera, na przykład tablica, wektor, mapa, itd., a nie dbają o indeksie, można użyć generalized looping (ADA 2012 tylko):

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

Zmienna nie jest tablica. Ale mógłbym użyć matrycy fikcyjnej dla tego zakresu, prawda? – clx

+0

Cóż, mógłbyś, ale posiadanie fałszywej tablicy do tego byłoby wysoce zniechęcające. Edytowałem swoją odpowiedź, aby dodać krótki przykład, jak to zrobić z atrybutami First i Last, jeśli zmienna jest typu dyskretnego. –

+0

@Marc, '' Pierwszy' i ''Ostatni' nie może być zastosowany do prostych zmiennych - tylko [tablice i (pod) typy] (http://www.ada-auth.org/standards/12rm/html/ RM-K-2.html # p66). –

1

Hmmm. Wygląda na to, że możesz być (być może nieświadomie) wielbicielem Andrei Alexandrescu. Argumentował on mocno za językami, aby uczynić zakresy typu pierwszej klasy, i usuwaniem "iteratorów" jako paradygmatem programowania.

Interesujące byłoby zobaczyć, jak będzie wyglądać taka implementacja Ada. Chyba że czegoś brakuje, to nie jest sposób, w jaki poszła Ada 2012.

+0

Koncepcja Andrei Alexandrescu brzmi naprawdę interesująco! – clx

1

Jeśli chcesz omijać obiekt zawierający ten zakres, możesz zawinąć początek i koniec w rekordzie. Wewnątrz podprogramu można lokalnie zadeklarować nowy typ [podrzędny] ograniczony przez zakres.

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

To musi być większy problem niż tworzenie ogólnej wersji! –

+0

@Simon: +1 i prawda. Myślę, że podświadomie wkradłem się do VHDL, w którym leki generyczne są bardziej restrykcyjne. Ta płyta byłaby co najmniej przenośna na VHDL ... –

1

Mój licznik mówi trzeba jeszcze 4 linie, aby stworzyć ogólny podprogram niż zwykły jednym:

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; 

który nie wydaje się tak źle.

Ale zwykle iteracja jest Iterowanie nad coś (tablicy, ...): Jeśli tak, to można wyprowadzić szereg iteracji z rzeczą, która jest powtórzyć na drugą.