Arrays 将数组传递给子例程

Arrays 将数组传递给子例程,arrays,pointers,fortran,subroutine,Arrays,Pointers,Fortran,Subroutine,当我将一个数组传递给一个子例程时,它是移动整个数组还是只移动指向内存路径的指针? 我的问题是: program run real,dimension :: p(200,200,200) integer :: i do i=0,10000000 call sub_p(p) enddo end subroutine sub_p(rhs) real,dimension :: rhs(200,200,200) ... end 因为如果整个数组被传

当我将一个数组传递给一个子例程时,它是移动整个数组还是只移动指向内存路径的指针? 我的问题是:

program run
   real,dimension :: p(200,200,200)
   integer :: i

   do i=0,10000000
      call sub_p(p)
   enddo
end

subroutine sub_p(rhs)
   real,dimension :: rhs(200,200,200)

   ...

end
因为如果整个数组被传递,它可能需要更长的运行时间

@弗拉基米尔: 因此,在上面的代码中,会传递一个指针,但如果代码看起来像以下内容,则会复制数组:

program run
   real,dimension :: p(200,200,200)
   integer,parameter :: imax = 198
   integer,parameter :: jmax = 198
   integer,parameter :: kmax = 198
   integer :: ib,ie,jb,je,kb,ke
   integer :: i

   ib=1; ie=ib+imax
   jb=1; je=jb+jmax
   kb=1; ke=kb+kmax

   do i=0,10000000
      call sub_p(p(ib:ie,jb:je,kb:ke))
   enddo
end

subroutine sub_p(rhs)
   integer,parameter :: imax = 198
   integer,parameter :: jmax = 198
   integer,parameter :: kmax = 198
   real,dimension :: rhs(imax,jmax,kmax)

   ...

end

我说的对吗?

是的,如果接口是隐式的,或者伪参数是一个显式的形状数组,正如您所做的那样,将传递一个指针。(标准没有明确说明这一点,但实际上这是唯一可能的实现

但是它可以是一个指向副本的指针!如果数组不连续并且接口是隐式的,那么将有一个副本

就你而言:

无副本:

call sub_p(p)
所需副本:

call similar_sub(p(1,:,:))

这部分取决于子例程的定义方式。[例如,伪参数是否具有
属性。]@francescalus代码是用F90标准编写的,甚至有值选项吗?在F90或95中没有,但从2003年开始默认情况下,fortran通过引用传递参数。因此,在您的情况下,没有副本。@chi86您可以通过附加一个选项(如-fcheck array temporaries或-fcheck=array temps)来确认是否创建了副本(对于gfortran)。我想ifort也会有类似的选项。好吧,我明白了。我在我的问题中添加了另一个示例。你能看一下吗?是的,另一个示例需要一份副本。