将数组传递给子例程

时间:2015-09-02 11:45:08

标签: 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

如果传递整个数组,那么运行时间可能会花费更长时间吗?

@Vladimir: 所以在上面的代码中传递了一个指针,但是如果代码如下所示,则复制数组?:

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

我是对的吗?

1 个答案:

答案 0 :(得分:2)

是的,如果接口是隐式的,或者伪参数是一个显式的形状数组,就像你一样,传递一个指针。 (标准没有明确说明,但实际上它是唯一可能的实现。

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

在你的情况下:

没有副本:

call sub_p(p)

需要的副本:

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