如何在ASSOCIATE块中保留Fortran数组边界?

时间:2012-11-27 03:18:46

标签: arrays fortran

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

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

我希望b的范围是24,但实际上它们是13。这该怎么做?提前谢谢!

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