我想将关联块中的数组边界保留为:
integer a(2:4,2)
associate (b => a(:,1))
print *, lbound(b), ubound(b)
end associate
我期望b
is2
和的范围4
,但实际上它们是1
and 3
。这个怎么做?提前致谢!
您正在关联到一个子数组,它的边界总是从 1 开始。尝试
print *, lbound(a(:,1),1)
AFAIK 你不能在associate
构造中使用指针重新映射技巧。具体来说:“如果选择器是一个数组,则关联实体是一个数组,每个维度的下界等于固有 LBOUND(selector) 的值。 ”
但是你当然可以使用指针
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