将可选参数传递给子例程
Handing optional parameters to subroutines
我有两个子程序。一个调用另一个,两者具有相同的可选参数:
program main
call a()
call a(7)
contains
subroutine a(var)
implicit none
integer, intent(in), optional :: var
call b(var)
end subroutine
subroutine b(var)
implicit none
integer, intent(in), optional :: var
if(present(var)) then
write (*,*) "var = ", var
else
write (*,*) "not given"
endif
end subroutine
end program main
在 a
的第一次调用中将 var
提供给 b
,即使没有提供。我在 gfortran 和 ifort 中试过这个,它似乎有效。不过我想知道:
这是有效的标准 fortran 还是我只是在滥用这里的一些漏洞?
我们多次使用那个,但你的问题导致我也验证了它。
根据现代 Fortran 解释(第 5.13 章)中的 Metcalf、Reid 和 Cohen,它是有效代码。只要虚拟参数也是可选的,就可以通过任意数量的后续调用传播可选参数。
Fortran 标准对此也有一些评论(第 15.5.2.12 章):
An optional dummy argument that is not present is subject to the following restrictions.
..
- shall not be supplied as an actual argument corresponding to a nonoptional dummy argument
other than as the argument of the intrinsic function PRESENT or as an argument of a function
reference that is a constant expression.
..
Except as noted in the list above, it may be supplied as an actual argument corresponding to an optional dummy
argument, which is then also considered not to be present.
我有两个子程序。一个调用另一个,两者具有相同的可选参数:
program main
call a()
call a(7)
contains
subroutine a(var)
implicit none
integer, intent(in), optional :: var
call b(var)
end subroutine
subroutine b(var)
implicit none
integer, intent(in), optional :: var
if(present(var)) then
write (*,*) "var = ", var
else
write (*,*) "not given"
endif
end subroutine
end program main
在 a
的第一次调用中将 var
提供给 b
,即使没有提供。我在 gfortran 和 ifort 中试过这个,它似乎有效。不过我想知道:
这是有效的标准 fortran 还是我只是在滥用这里的一些漏洞?
我们多次使用那个,但你的问题导致我也验证了它。
根据现代 Fortran 解释(第 5.13 章)中的 Metcalf、Reid 和 Cohen,它是有效代码。只要虚拟参数也是可选的,就可以通过任意数量的后续调用传播可选参数。
Fortran 标准对此也有一些评论(第 15.5.2.12 章):
An optional dummy argument that is not present is subject to the following restrictions.
..
- shall not be supplied as an actual argument corresponding to a nonoptional dummy argument other than as the argument of the intrinsic function PRESENT or as an argument of a function reference that is a constant expression.
..
Except as noted in the list above, it may be supplied as an actual argument corresponding to an optional dummy argument, which is then also considered not to be present.