簡體   English   中英

將數組傳遞給子例程

[英]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

因為如果整個數組都通過了,那么關於運行時間可能會花費更長的時間?

@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

我對嗎?

是的,如果接口是隱式的,或者啞元參數是顯式的形狀數組,則將傳遞一個指針。 (該標准並未明確說明,但實際上,這是唯一可能的實現。

但這可以是副本的指針! 如果數組不連續且接口是隱式的,則將有一個副本!

在您的情況下:

無副本:

call sub_p(p)

需要副本:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM