在Fortran函数中使用可选参数进行分段错误

ros*_*lho 6 fortran function optional-parameters

我可以使用带有intent(in)和的子程序的Fortran可选intent(inout)参数,但是函数可选参数只能用于intent(in),对吗?随着intent(inout)我得到了下面的代码段错误:

real function foo(x, tol) 
    real, intent(in) :: x
    real, optional, intent(inout) :: tol
    if( .not. present(tol) ) tol = 1e-6
    !...
end function foo
Run Code Online (Sandbox Code Playgroud)

ros*_*lho 5

我发现了问题,即使没有出现在第四行(在中tol = 1e-6),我也使用了变量:

real function foo(x, tol) 
    real, intent(in) :: x
    real, optional, intent(inout) :: tol
    if( .not. present(tol) ) tol = 1e-6
    !...
end function foo 
Run Code Online (Sandbox Code Playgroud)

但是,即使在不存在的情况下,我也想使用它并设置默认值,例如在C ++中,我们要做类似的事情

double foo(double x, double tol=1e-6)
Run Code Online (Sandbox Code Playgroud)

不幸的是,似乎在Fortran中是不可能的。

  • 您无法定义/分配/使用不存在的可选参数。您必须使用另一个变量。例如,命名您可选的var * opt_tol *,并在程序中定义* tol *(*如果存在(opt_tol),则tol = opt_tol,否则tol =默认值*)。请参阅[Fortran 2003标准]的12.4.1.6节(http://www.j3-fortran.org/doc/year/04/04-007.pdf)。 (4认同)
  • 那些刚学习过OPTIONAL的人经常犯的一个错误是,没有意识到使用OPTIONAL的过程的调用者需要与被调用例程的显式接口。参见http://software.intel.com/zh-cn/forums/topic/275071#comment-1548437和http://software.intel.com/zh-cn/blogs/2012/01/05/doctor-fortran再次获取显式信息以获取更多信息。 (3认同)