石子 发表于 2024-6-13 22:55:10

通过subtoutine的参数传递数组,但lbound返回的数组边界变化

本帖最后由 石子 于 2024-6-13 22:58 编辑

如题。MPI并行,但我感觉这个的问题可能和并行关系不大。我在程序里首先针对不同的rank设定了二维数组的上下界,并要求输出,然后让所有的rank均分配了数组e。
call set_blockbc(rank,bl_xmin,bl_xmax,bl_ymin,bl_ymax)
    print*,rank,bl_xmin,bl_xmax,bl_ymin,bl_ymax
allocate(e(bl_xmin-1:bl_xmax+1,bl_ymin-1:bl_ymax+1),STAT=status0)
其中关于rank 1的输出结果如下:
2          30          31         230
设定值是我预设的,且其他rank均正常。
然后,我让rank 1调用了另一个子程序,形式为:call launch_gauss(rank,e,an,1)
subroutine里面我通过lbound和ubound检测rank 1所对应e的上下界,发现和在main程序里面设定的有所不同,输出如下:
1          31         1         202
subroutine 中对e的定义与相应的语句为:
type(efield),dimension(:,:),intent(inout)::e
    xl = lbound(e, dim=1)
    xu = ubound(e, dim=1)
    yl = lbound(e, dim=2)
    yu = ubound(e, dim=2)
    print*,xl,xu,lbound(e,dim=2),ubound(e,dim=2)
在输出上下边界之前,我并未对e进行其他操作。按照预设,e的边界值应该是:1 31 30 231.但似乎数组的边界发生了变化?这是什么原因呢



fcode 发表于 2024-6-14 08:58:47

假定形状的参数,只传递大小,不传递上下限。
real :: a(0:3)
call sub(a)

subroutine sub(x)
real :: x(:) !//此处的 x 为x(1:4)
end subroutine sub

石子 发表于 2024-6-14 12:36:27

fcode 发表于 2024-6-14 08:58
假定形状的参数,只传递大小,不传递上下限。
real :: a(0:3)
call sub(a)


好的,明白了,谢谢
页: [1]
查看完整版本: 通过subtoutine的参数传递数组,但lbound返回的数组边界变化