Zuo*_* Lu 2 fortran subroutine
我有一个FORTRAN文件"testValueKeyword.for"包含以下代码
subroutine intersub2(x,y)
integer, value :: x
integer y
x = x + y
y = x*y
print *, 'in subroutine after changing: ', x, y
end subroutine
program testValueKeyword
integer :: x = 10, y = 20
print *, 'before calling: ', x, y
call intersub(x, y)
print *, 'after calling: ', x, y
x = 10
y = 20
call intersub2(x, y)
contains
subroutine intersub(x,y)
integer, value :: x
integer y
x = x + y
y = x*y
print *, 'in subroutine after changing: ', x, y
end subroutine
end program
Run Code Online (Sandbox Code Playgroud)
子程序intersub和intersub2包含相同的代码,两者都通过值传递x参数,但是intersub2似乎传递了一个类似于内存地址的大型随机整数.运行后我得到不同的y值.你能解释一下吗?
将子例程intersub2放入一个模块和use来自调用者的模块,这里是程序testValueKeyword,以便调用者"知道"要使用的调用约定.在过程(子例程或函数)中使用Fortran> = 90的"高级"参数功能时,需要使接口对调用者显式,以便调用者使用与过程相同的接口/调用约定.否则,呼叫者和被呼叫者之间的不一致将导致两者之间的"随机"通信.使接口知道的最简单方法是将过程放入模块和use模块中.你也可以用a来描述这个过程interface,但这需要更多的工作和第二件事要维护.
当我使用带有广泛警告选项的gfortran编译代码时,gfortran甚至会告诉我这个问题:
call intersub2(x, y)
1
Error: Dummy argument 'x' of procedure 'intersub2' at (1) has an attribute that requires an explicit interface for this procedure
Run Code Online (Sandbox Code Playgroud)
如果您正在使用gfortran,请尝试使用以下编译器选项进行调试: -O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -std=f2008 -pedantic -fbacktrace