ここで最初に頭に浮かんだのは、「いいえ、これはうまくいきません」でした。しかし、それから私はGNAT GPL2012でこれを書きました:
with Text_IO; use Text_IO;
procedure Ren_Test is
type Shared_Array is array (Integer range 1 .. 10) of Integer;
Array1 : Shared_Array := (others => 42);
Array2 : Shared_Array renames Array1(1..5);
begin
Put_Line("Array1 range: " & Integer'Image(Array1'First) & " .."
& Integer'Image(Array1'Last));
Put_Line("Array2 range: " & Integer'Image(Array2'First) & " .."
& Integer'Image(Array2'Last));
New_Line;
Put_Line("Dump Array1");
for I in Array1'Range loop
Put(Integer'Image(Array1(I)));
if I /= Array1'Last then
Put(",");
end if;
end loop;
New_Line(2);
Put_Line("Dump and modify renaming Array2");
for I in Array2'Range loop
Put(Integer'Image(Array2(I)));
if I /= Array2'Last then
Put(",");
end if;
Array1(I) := Array1(I) + 17;
end loop;
New_Line(2);
Put_Line("Redump Array1");
for I in Array1'Range loop
Put(Integer'Image(Array1(I)));
if I /= Array1'Last then
Put(",");
end if;
end loop;
New_Line;
end Ren_Test;
それを実行すると私が得ます:
[35] Marc say: ./ren_test
Array1 range: 1 .. 10
Array2 range: 1 .. 5
Dump Array1
42, 42, 42, 42, 42, 42, 42, 42, 42, 42
Dump and modify renaming Array2
42, 42, 42, 42, 42
Redump Array1
59, 59, 59, 59, 59, 42, 42, 42, 42, 42
これは、主に、制約された配列を宣言されたサイズよりも小さくスライスした結果、Constraint_Errorが発生すると予想したためです。したがって、これが合法的なコードであるかどうかはわかりません。GNATGPL2012が問題なくコンパイルおよび実行されることは知っています。
Shared_Arrayが制約のない配列である場合、私ははるかに快適です。
type Shared_Array is array (Integer range <>) of Integer;
Array1 : Shared_Array (1..10) := (others => 42);
Array2 : Shared_Array renames Array1(1..5);
後者は、標準に準拠することを期待しています。最初の、制約された形式... IMHO、iffy。(ただし、これを確認するのは言語弁護士に任せます。)