2

次のコードでは、またはAを使用して、配列の 1 行目と 2 行目を取得しようとしています。ここで、私の理解では、常に新しい配列が作成され、右側へのエイリアス (または参照) が作成されます。varrefvarref

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)

だから私は(配列型として)との間にいくつかの違いがあるかどうか疑問に思っています... row1vec

4

1 に答える 1