5

我想将关联块中的数组边界保留为:

integer a(2:4,2)
associate (b => a(:,1))
    print *, lbound(b), ubound(b)
end associate

我期望bis2和的范围4,但实际上它们是1and 3。这个怎么做?提前致谢!

4

3 回答 3

4

您正在关联到一个子数组,它的边界总是从 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
于 2012-11-27T07:56:29.250 回答
0

我认为保留数组边界的更优雅的方法是执行以下操作:

integer,target  :: a(2:4,2)
integer,pointer :: b(:)

b(lbound(a,1):) => a(:,1)
于 2014-06-03T07:47:01.277 回答
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
于 2018-12-12T16:56:36.740 回答