我想将关联块中的数组边界保存为:
integer a(2:4,2)
associate (b => a(:,1))
print *, lbound(b), ubound(b)
end associate
我希望b
的范围是2
和4
,但实际上它们是1
和3
。这该怎么做?提前谢谢!
答案 0 :(得分:4)
您正在关联一个子阵列,其边界始终从1开始。尝试
print *, lbound(a(:,1),1)
AFAIK你不能在associate
构造中使用指针重映射技巧。具体来说:“If the selector is an array, the associating entity is an array with a lower bound for each dimension equal to the value of the intrinsic 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
答案 1 :(得分:0)
我认为保留数组边界的更优雅的方法是执行以下操作:
integer,target :: a(2:4,2)
integer,pointer :: b(:)
b(lbound(a,1):) => a(:,1)
答案 2 :(得分:0)
这是@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