次のコードでは、またはA
を使用して、配列の 1 行目と 2 行目を取得しようとしています。ここで、私の理解では、常に新しい配列が作成され、右側へのエイリアス (または参照) が作成されます。var
ref
var
ref
var A: [1..2, 1..3] int;
A = 0;
var row1 = A[ 1, .. ];
ref row2 = A[ 2, .. ];
row1 = 10;
row2 = 20;
writeln( "row1 = ", row1 );
writeln( "row2 = ", row2 );
writeln( "A = ", A );
結果は期待どおりです (つまり、 の 1 行目A
は変更されていません)。
row1 = 10 10 10
row2 = 20 20 20
A = 0 0 0
20 20 20
しかし、タイプを印刷するrow1
と、row2
writeln( "row1.type = ", row1.type: string );
writeln( "row2.type = ", row2.type: string );
私はこの結果を得ます:
row1.type = [ArrayViewRankChangeDom(1,int(64),false,2*bool,2*int(64),ArrayViewRankChangeDist(DefaultDist,2*bool,2*int(64)))] int(64)
row2.type = [ArrayViewRankChangeDom(1,int(64),false,2*bool,2*int(64),ArrayViewRankChangeDist(DefaultDist,2*bool,2*int(64)))] int(64)
row1
「通常の」配列 (つまり、エイリアスではない) であると想定していたため、これは少し驚くべきことです。たとえば、次のようになりますvec
(これを「通常の」配列と呼びます)。
var vec: [1..3] int;
writeln( "vec.type = ", vec.type: string );
与える
vec.type = [domain(1,int(64),false)] int(64)
だから私は(配列型として)との間にいくつかの違いがあるかどうか疑問に思っています... row1
?vec