我有两个子程序。一个调用另一个,两者都具有相同的可选参数:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if movies.count == 0 {
return 1
} else {
return movies.count
}
}
在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
,即使未给出也是如此。我在gfortran和ifort中尝试了这个,它似乎起作用了。我想知道的是:
这是有效的standard-fortran还是我在这里滥用一些漏洞?
答案 0 :(得分:0)
我们使用了很多次,但是您的问题使我也进行了验证。
根据《现代Fortran解释》(第5.13章)中的Metcalf,Reid和Cohen,它是有效的代码。可选参数可以通过任意数量的后续调用传播,只要哑元参数也是可选的即可。
Fortran标准对此也有一些评论(第15.5.2.12章):
不存在的可选虚拟参数受以下限制。
..
- 不得作为与非可选虚拟参数相对应的实际参数提供 除了作为内在函数PRESENT的自变量或作为函数的自变量之外 引用是一个常量表达式。
..
除了上面的列表中所述,它可以作为对应于可选虚拟对象的实际参数提供 论点,然后也将其视为不存在。