【问题标题】:Can we avoid creating a local variable if an optional argument is not PRESENT?如果可选参数不存在,我们可以避免创建局部变量吗?
【发布时间】:2013-08-18 17:57:03
【问题描述】:

我在使用 Fortran 95 的 PRESENT 语句时遇到问题。目前我正在使用 Silverfrost 的 Plato 及其 FTN95 编译器(在“发布 Win32”模式下)。我想做的是创建一个子程序SUB(a,b),其中b 是一个可选变量。到目前为止一切顺利,但是当我尝试使用if (.NOT. present(b)) b=0b 赋予新值时,问题就出现了。这是代码:

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

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

if (present(b)) then
  b_aux=b
  else
    b_aux=0
endif

【问题讨论】:

    标签: module fortran subroutine optional-arguments


    【解决方案1】:

    不能使用不存在的变量,所以需要辅助局部变量等方法。

    【讨论】:

    • 这个特性很容易引起误解,因为许多具有可选参数的语言也有使用它们的方法(通常使用初始化值)。但事实上,Fortran 2003 的第 12.4.1.6 节指出: 应存在非可选的伪参数。不存在的可选伪参数受以下限制: (1) 如果它是数据对象,则不应引用或定义它。如果它是为某些组件指定了默认初始化的类型,则初始化无效。 [...]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 2017-04-02
    • 2017-01-24
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多