如果可选参数不是PRESENT,我们可以避免创建局部变量吗?

gil*_*ofb 5 fortran module subroutine optional-arguments

我对PRESENT使用Fortran 95 的语句有疑问.目前我正在使用Silverfrost的Plato和他们的FTN95编译器(在"Release Win32"模式下).我想要做的是创建一个子程序SUB(a,b),其中b是一个可选变量.到目前为止一切都那么好,但是当我试图给出一个新的价值时,问题就出现bif (.NOT. present(b)) b=0.这是代码:

module MOD
contains
  subroutine SUB(a,b)
  implicit none
  integer :: a
  integer,optional :: b
  if (.NOT. present(b)) b=0
  print*, a,b
  end subroutine SUB
end module MOD

program TEST
use MOD
implicit none

integer :: i=2, j=1

call SUB(i,j)
call SUB(i)
call SUB(j)

end program TEST
Run Code Online (Sandbox Code Playgroud)

有没有一种优雅的方式摆脱这种情况,或者我真的需要创建另一个变量,b_aux例如,然后使用以下代码?:

if (present(b)) then
  b_aux=b
  else
    b_aux=0
endif
Run Code Online (Sandbox Code Playgroud)

M. *_* B. 8

您不能使用不存在的变量,因此需要一种方法,例如辅助局部变量.

  • 此功能非常具有误导性,因为许多具有可选参数的语言也可以使用它们(通常使用初始化值).但实际上,Fortran 2003的第12.4.1.6节规定:***应存在一个非可选的伪参数.不存在的可选伪参数受以下限制:(1)如果它是数据对象,则不应引用或定义它.如果它是为某个组件指定了默认初始化的类型,则初始化无效.[...]*** (3认同)