将可选参数传递给子例程

时间:2018-08-10 11:29:58

标签: fortran optional-parameters

我有两个子程序。一个调用另一个,两者都具有相同的可选参数:

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还是我在这里滥用一些漏洞?

1 个答案:

答案 0 :(得分:0)

我们使用了很多次,但是您的问题使我也进行了验证。

根据《现代Fortran解释》(第5.13章)中的Metcalf,Reid和Cohen,它是有效的代码。可选参数可以通过任意数量的后续调用传播,只要哑元参数也是可选的即可。

Fortran标准对此也有一些评论(第15.5.2.12章):

  

不存在的可选虚拟参数受以下限制。

     

..

     
      
  1. 不得作为与非可选虚拟参数相对应的实际参数提供   除了作为内在函数PRESENT的自变量或作为函数的自变量之外   引用是一个常量表达式。
  2.   
     

..

     

除了上面的列表中所述,它可以作为对应于可选虚拟对象的实际参数提供   论点,然后也将其视为不存在。