9

关于可选参数的使用,我有以下问题。假设我aaa在模块中定义了以下例程m_aaa

MODULE m_aaa
SUBROUTINE aaa(a, b)
  INTEGER           :: a
  INTEGER, OPTIONAL :: b
END SUBROUTINE
END MODULE

现在我有第二个使用模块的例程m_aaa。是否可以像这样传递可选参数

! Variant 1:
SUBROUTINE bbb(c, d)
  USE m_aaa 
  INTEGER           :: c
  INTEGER, OPTIONAL :: d
  CALL aaa(c,d)
END SUBROUTINE  

或者是否有必要像这样检查可选参数 d 的存在:

! Variant 2:
SUBROUTINE bbb(c, d)
  USE m_aaa 
  INTEGER           :: c
  INTEGER, OPTIONAL :: d
  IF (PRESENT(d)) THEN
    CALL aaa(c,d)
  ELSE
    CALL aaa(c)
  ENDIF
END SUBROUTINE  

谢谢你的帮助。

4

1 回答 1

11

在将可选虚拟参数作为实际参数传递给另一个可选虚拟参数之前,没有必要检查它是否存在。

对于不存在的可选实际参数,12.5.2.12 第 4 段(ISO/IEC 1539-1(2010 年 6 月 7 日草案)又名 Fortran 2008)允许这样做:

除非在上面的列表中注明,否则它可以作为对应于可选虚拟参数的实际参数提供,该虚拟参数也被认为不存在。

于 2014-10-14T19:25:03.517 回答