bfl*_*tch 5 fortran slice fortran90
假设我将一个数组切片传递给一个操作其输入的子程序:
some_subroutine(a(:,1))
Run Code Online (Sandbox Code Playgroud)
该部分的原件是否被a
更改,或者是一些a(:,1)
改变的副本?
还有其他几个答案,可能会解决略有不同(但相关)的问题.在这里,我将尝试调和它们.
弗拉基米尔F的答案着眼于所谓的复制/复制机制; bfletch回答了对论证的最终影响.
一般来说,效果如下
integer i(2,2)
i=0
call dosomething(i(1,:)) ! Just to make it not contiguous.
contains
subroutine dosomething(j)
integer j(2) ! or j(*), or j(:)
j=1
end subroutine
end program
Run Code Online (Sandbox Code Playgroud)
是数组i
有一些元素设置1
和其他元素0
.所以,是的:无论是否有临时副本(从一个答案),在调用之后可以观察到的是它是被修改的实际参数本身.
当然,有一个例外:value
属性.1如果上面的子程序是相反的
subroutine doseomthing(j)
integer, value :: j(2)
j=1
end subroutine
Run Code Online (Sandbox Code Playgroud)
那确实是论证的真实副本.对伪参数的修改j
不会反映在实际参数的部分中i
.
1这是针对当前的Fortran.被标记的Fortran 90没有此功能.
归档时间: |
|
查看次数: |
1150 次 |
最近记录: |