将数组传递给子例程
Passing an array to a 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,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,:,:))
当我将数组传递给子例程时,它是移动整个数组还是只是指向内存路径的指针? 我的问题看起来像:
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,:,:))