Fortran级联可选参数

Fortran级联可选参数,fortran,optional,Fortran,Optional,我在使用可选参数时遇到问题。我有两个例程num_to_str和qry,它们将格式fm作为可选参数。当我打电话给qry lc时,即使 fm不存在,例程num_to_str认为fm存在 Call qry ("lc") Subroutine qry (lb, fm) Character (Len=*), Intent (In), Optional :: lb, fm Real :: n Character (Len=65) :: s n = 90.0 Call num_to

我在使用可选参数时遇到问题。我有两个例程num_to_str和qry,它们将格式fm作为可选参数。当我打电话给qry lc时,即使 fm不存在,例程num_to_str认为fm存在

Call qry ("lc")

Subroutine qry (lb, fm)
  Character (Len=*), Intent (In), Optional :: lb, fm
  Real :: n 
  Character (Len=65) :: s 

  n = 90.0
  Call num_to_str (n, s, fm)
End Subroutine

Subroutine num_to_str (nb, s, fm)
  Real, Intent (In) :: nb
  Character (Len=*), Intent (In) :: s
  Character (Len=*), Intent (In), Optional :: fm

  fmt = "*"
  if (Present (fm)) fmt = Trim (fm)
End Subroutine  

以下内容适用于英特尔fortran和gfortran

module stuff
  implicit none

contains 

  Subroutine qry (lb, fm)
    Character (Len=*), Intent (In), Optional :: lb, fm
    Real :: n 
    Character (Len=65) :: s

    n = 90.0
    s = "test"
    Call num_to_str (n, s, fm)
  End Subroutine

  Subroutine num_to_str (nb, s, fm)
    Real, Intent (In) :: nb
    Character (Len=*), Intent (In) :: s
    Character (Len=*), Intent (In), Optional :: fm
    Character (Len=65)  :: fmt

    fmt = "*"
    if (Present (fm)) then 
        fmt = Trim (fm)
        print*, nb, s, fm
    else
        print*, nb, s
    endif
  End Subroutine  

end module stuff

program test
  use stuff, only : qry

  Call qry("lc")
  Call qry("lc","f12")

end program test
有输出

 $ ./a.out 
 90.000000     test                                                             
 90.000000     test               f12

对于可选参数,应始终使用模块或显式接口。检查此

在引用它们的作用域中,两个子例程是否都可以访问显式接口?num_to_str在模块核心中,而qry在模块晶格中。qry中的当前fm返回T,但是当我尝试打印fm时,我得到了无效的内存引用。什么编译器/编译选项?对于所示的示例代码,请注意,fmt presentfm不存在声明。gfortran-ffree form-g-J./build/lib。我同意你的看法,现在的fm应该是假的。我不确定问题是否解决了,但这次问题没有发生。可能是其中一个对象文件未更新