我有一个子例程,该子例程声明i
并将其传递给其他小的子例程。在那些小的子例程中,声明了其他具有相同名称的变量,即i
,并且在内部使用。一旦离开了小子例程,人们就会期望它具有与i
最初传递的值相同的值,但这不是真实情况,并且i
包含在小子例程中分配的最后一个参数的值。这是一个简单的示例:
subroutine smallSub1(i)
integer i,start,end
start=i
end = start +10
do i=start, end
write(*,*) i
enddo
end subroutine smallSub1
subroutine caller
integer i
i = 1
call smallSub1(i)
write(*,*) i
end subroutine caller
我的问题是,如何避免F77中的这种行为?
我在这里的担心是:考虑一个子例程是一个黑匣子的情况,您只需要传递一个整数,但是您不希望该整数值从smallSub1
子例程中更改。变量start
和end
将取决于的值,i
但是它们不应替换i
out of中的原始值smallSub1
在给出的代码示例中,有两个变量i
:每个子例程中都有一个。在子例程中caller
,i
它是局部变量,在子例程中,smallSub1
它是伪参数。
当您拥有时,call smallSub1(i)
您将i
通过参数关联将两个变量彼此关联。那么,在这种简单情况下,对i
in的任何更改都会smallSub1
影响i
in caller
。这里有自变量关联的工作方式。
传统上,确实有一个黑匣子,当不希望在子例程中更改参数时,会在其中进行更改。例如,将其用作工作空间的地方。在这种情况下,一个人会做类似的事情
inew = i
call smallSub1(inew)
... continue using i
但是,在这种情况下,我可以轻松地更改子例程。引入一个额外的局部变量:
subroutine smallSub1(i)
integer i ! Dummy argument - we don't want to change it
integer start,end
integer j ! Local variable - we're quite free to change it
! In general, we'd have j=i at the start and use that instead
start=i
end = start +10
do j=start, end
write(*,*) j
enddo
end subroutine smallSub1
而且对于现代的Fortran,甚至可以拥有一个value
属性,该属性可以应用于虚拟参数,从而可以在不影响实际参数的情况下对其进行更改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句