Fortran级联可选参数
我在使用可选参数时遇到问题。我有两个例程num_to_str和qry,它们将格式fm作为可选参数。当我打电话给qry lc时,即使 fm不存在,例程num_to_str认为fm存在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
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应该是假的。我不确定问题是否解决了,但这次问题没有发生。可能是其中一个对象文件未更新