関連ブロックの配列境界を次のように保持したいと思います。
integer a(2:4,2)
associate (b => a(:,1))
print *, lbound(b), ubound(b)
end associate
b
is2
との境界を期待しますが、4
実際にはとです。これを行う方法?前もって感謝します!1
3
サブアレイに関連付けています。その境界は常に1から始まります。試してください
print *, lbound(a(:,1),1)
AFAIKでは、ポインタの再マッピングのトリックを構成で使用することはできませんassociate
。具体的には、「セレクターが配列の場合、関連付けエンティティは、各次元の下限が固有のLBOUND(セレクター)の値に等しい配列です。」
ただし、もちろんポインタを使用することもできます
integer,target :: a(2:4,2)
integer,pointer :: c(:)
associate (b => a(:,1))
print *, lbound(b), ubound(b)
end associate
c(2:4) => a(:,1)
print *, lbound(c), ubound(c)
end
配列の境界を保持するためのより洗練された方法は、次のことを行うことだと思います。
integer,target :: a(2:4,2)
integer,pointer :: b(:)
b(lbound(a,1):) => a(:,1)
これは、@VladimirFの回答を単純に拡張したものです。ポインタを標準ブロックに配置するだけで、目的の効果がほぼ正確になります(たとえば、ポインタのスコープは、関連するブロックの場合と同様に、ローカルのみです)。
integer,target :: a(2:4,2)
block
integer,pointer :: c(:)
c(2:4) => a(:,1)
print *, lbound(c), ubound(c) ! 2 4
end block