2013-01-21 25 views
5

Một vòng lặp for có thể được thực hiện trong Ada sử dụng một loạt với một sự khởi đầu và điểm kết thúc:Loại nào có biến chứa phạm vi?

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

tôi biết, nó có thể làm vòng lặp for sử dụng hai biến mô tả phạm vi:

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

là nó cũng có thể lưu trữ nhiều trong một biến ?, như:

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

Loại nào có biến * my_range * phải là?

Chỉnh sửa: Giả sử tôi muốn sử dụng biến này làm tham số trong chương trình con: Vì vậy, chương trình con có vòng lặp này lặp lại trong phạm vi. Tôi muốn sử dụng hai biến mô tả phạm vi thay vì sử dụng Generics, vì Generics sẽ gây ra nỗ lực cao hơn. Nhưng tôi nghĩ rằng việc sử dụng một biến mô tả phạm vi sẽ gây ra khả năng đọc cao hơn, đó là lý do tại sao tôi hỏi câu hỏi đó.

Trả lời

2

Sử dụng một loại range, một cái gì đó dọc theo những dòng:

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

Xem ví dụ hoàn chỉnh trong here.

+0

Nhưng nếu tôi muốn sử dụng phạm vi làm tham số cho chương trình con, tôi phải sử dụng Generics, phải không?Vì vậy, tôi nghĩ rằng giải pháp này làm cho nó phức tạp hơn việc sử dụng hai biến ... – clx

+0

Phạm vi là một loại như bất kỳ loại nào khác, bạn có thể vượt qua phạm vi hoặc đi dọc theo hai điểm và xây dựng phạm vi cần thiết –

3

Nếu biến của bạn là một mảng, sau đó bạn có thể lặp lại trên phạm vi của nó thông qua:

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

Nếu bạn quan tâm đến iterating trên các yếu tố của một container, ví dụ mảng, vector, bản đồ, vv, và không quan tâm đến các chỉ mục, bạn có thể sử dụng generalized looping (Ada 2012 chỉ):

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

Biến không phải là một mảng. Nhưng tôi có thể sử dụng một mảng giả cho phạm vi, phải không? – clx

+0

Vâng, bạn có thể, nhưng có một mảng không có thật chỉ cho rằng sẽ được đánh giá cao nản lòng. Tôi đã chỉnh sửa câu trả lời của mình để thêm một ví dụ ngắn gọn về cách thực hiện điều này với thuộc tính Đầu tiên và Cuối cùng nếu biến đó thuộc loại rời rạc. –

+0

@Marc, ''First' &'' Last' không thể áp dụng cho các biến đơn giản - chỉ [mảng và (loại phụ)] (http://www.ada-auth.org/standards/12rm/html/ RM-K-2.html # p66). –

1

Hmmm. Có vẻ như bạn có thể (có lẽ vô tình) là người sùng kính số Andrei Alexandrescu. Ông đã lập luận mạnh mẽ cho các ngôn ngữ để làm cho phạm vi một loại hạng nhất, và loại bỏ các "vòng lặp" như một mô hình lập trình.

Thật thú vị khi xem việc triển khai Ada sẽ như thế nào. Trừ khi tôi đang thiếu một cái gì đó, đó không phải là cách Ada 2012 đi.

+0

Khái niệm của Andrei Alexandrescu nghe có vẻ thực sự hấp dẫn! – clx

1

Nếu bạn muốn truyền xung quanh một đối tượng có chứa phạm vi, bạn có thể quấn Bắt đầu và Kết thúc trong một bản ghi. Bên trong chương trình con, bạn có thể khai báo một kiểu [sub] mới được giới hạn bởi phạm vi.

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

Điều này phải có nhiều rắc rối hơn là tạo ra một chung chung! –

+0

@Simon: +1 và đúng. Tôi nghĩ rằng tôi vô thức trượt vào VHDL, nơi generics là hạn chế hơn. Kỷ lục sẽ ít nhất là di động để VHDL ... –

1

count tôi nói rằng bạn cần thêm 4 dòng để tạo ra một chương trình con chung hơn là một đồng bằng một:

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; 

mà dường như không quá tệ.

Tuy nhiên, thường một lần lặp lặp lại trên một cái gì đó (một mảng, ...): nếu có, bạn có thể lấy được phạm vi lặp lại từ thứ đang được lặp lại.