【问题标题】:How can I use an optional argument with a function in a Fortran module? [duplicate]如何在 Fortran 模块中将可选参数与函数一起使用? [复制]
【发布时间】:2019-09-16 08:50:22
【问题描述】:

我在 Fortran 模块中有一个函数,它有两个必需参数和一个可选参数。如果可选参数不存在,我想在函数中为其设置一个默认值。

当我使用该函数时,我得到一个分段错误:Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

回溯指的是第一行

if (.not. present(optionalArg)) then
    optionalArg = 2
end if

并且定义了函数

function func(reqArg1, reqArg2, optionalArg)
    real(kind=real64), intent(in) :: reqArg1
    integer, intent(in) :: reqArg2
    integer, optional :: optionalArg
    real(kind=real64), dimension(reqArg2) :: func
    ...

这是定义带有可选参数的函数的正确方法吗?我已经尝试在调用另一个函数的模块和定义函数的模块中为函数编写显式接口,但都给我错误。如果我将接口放在调用函数的模块中,我会得到Error: Cannot change attributes of USE-associated symbol func,因为该模块已经包含在USE 语句中,如果我将接口放在函数的模块中,我会收到关于函数已经拥有的错误当编译器到达CONTAINS 块中的实际函数定义时定义。

【问题讨论】:

标签: fortran


【解决方案1】:

此代码显然无效

if (.not. present(optionalArg)) then
    optionalArg = 2
end if

您无法访问不存在的可选参数的值。你不能读也不能设置,你必须使用不同的局部变量,我相信这里的其他问题和答案中有例子。

if (.not. present(optionalArg)) then
    optionalArg_local = 2
end if

【讨论】:

  • 谢谢,我正在研究一个例子,但这似乎是答案。我格式化了局部变量的设置,如this thread in the Intel forums 上第一个示例程序的第 14-15 行所示,现在错误消失了。
猜你喜欢
  • 2019-10-10
  • 2013-05-10
  • 1970-01-01
  • 2020-04-24
  • 2022-04-27
  • 2016-09-10
  • 2014-08-30
  • 1970-01-01
相关资源
最近更新 更多