可以说有一个向量:
REAL(KIND=dp), DIMENSION(maxn) :: rho
它是在初始子程序(以及dp
和maxn
)中分配的值,并从主程序中调用。
然后,主程序调用一个模块,该模块包含一个(不同的)子例程进行演化rho
。的子例程参数rho
定义为:
SUBROUTINE sum_density(a, b, c, ....., rho)
在此子例程中,rho声明为:
REAL(KIND=dp), DIMENSION(maxn), INTENT(OUT) :: rho
但是,在将任何值与关联之前,代码包含以下行rho
:
foo1= foo2*foo3(i)/rho(i)
我以为模块子例程将无法访问rho
主程序中的定义。我希望编译器抱怨并要求将意图更改为(INOUT)
或说rho
未定义之类的内容。即使我确实将其更改为结果(INOUT)
也没有差异。rho
即使意图声明为,模块子例程也必须正在主程序中访问并使用它的值OUT
。
我的问题是-在这种情况下,使用inINTENT(OUT)
和the和有INTENT(INOUT)
什么区别?
对于该INTENT(OUT)
程序,该程序不符合标准,因为它访问具有未定义值的数组。
但是,由于通常通过显示数组的地址来实现显式形状数组,因此软件实现可能会起作用。如果您传递的数组是非连续的,则可以说
rho(::2)
编译器很可能会创建一个副本,该副本会传递给您,并且您可能会遇到问题,因为该数组可能包含带有的垃圾intent(out)
。
关于警告,它们不是强制性的,但是如果您使用诸如-warn
或的标志,则编译器会对此发出警告-Wall
。
对于intent(in)
差异,当您尝试修改时会出现rho
。如果尝试编译器必须发出错误。
关于范围:
在这里谈论范围并不是真的正确,原始rho
的绝对不在子程序的范围内,只有哑元参数才是。重复使用相同名称可能会造成混淆。想象一下,它们实际上是rho1
在程序和rho2
子例程中调用的。那么很明显,这rho1
不在子例程的范围内,而是在子例程的范围内rho2
。
现在,rho2
不能保证具有相同的价值rho1
在与子程序的开始intent(out)
,但它保证能够拥有它intent(inout)
。原因是可以使用copy-in和copy-out来实现参数传递,而对于则可以省略copy-in intent(out)
。
考虑以下代码:
module m
contains
subroutine sub(a2)
real, intent(out) :: a2(4)
print *,a2
a2 = 2
end subroutine
end
use m
real :: a1(8)
a1 = 1
call sub(a1(::2))
end
对于某些编译器,它会像预期的那样打印四次,而对于其他编译器或某些编译器参数,它会打印垃圾:
sunf90 intent2.f90
./a.out
5.879759E-39 0.0E+0 0.0E+0 0.0E+0
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句