在Gfortran中使用可选参数时的接口不明确

时间:2018-12-11 12:34:26

标签: fortran gfortran

在编译一些我已经使用了很长时间的代码时,我偶然发现了这个错误。我在Linux上使用Gfortran 8.2,我怀疑编译器更新导致了此问题。

当我定义带有可选参数的接口时,该可选参数具有不同数量的非可选参数,Gfortran抱怨该接口不明确。例如,如果我编译以下内容,则会得到“在(1)处的'testinit1'和在(2)处的'testinit2'的通用接口'test'中的歧义接口”:

module test_mod
implicit none

interface Test
    module procedure test1, test2
end interface

contains

function test1(opt) result(rslt)
    integer :: rslt
    integer, optional :: opt
    rslt = 1
end function

function test2(data, opt) result(rslt)
    integer :: rslt
    integer :: data
    integer, optional :: opt
    rslt = data
end function

end module

如果我删除可选参数opt,则可以正常编译。如果我向data添加一个test1参数,而该参数与test2的数据具有不同的等级,则可以很好地编译。如果我在两个函数中都添加了另一个非可选参数,则会得到相同的错误消息。

我偶然发现的实际代码是this file中的Result接口,正如我所说的,它曾经按预期进行编译。

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:3)

  

Gfortran抱怨界面不明确

好吧,这是因为界面 含糊不清。 在以下调用中应选择哪个过程?

integer :: param
print *, Test(param)
  1. test1带有参数opt的选择?或者...
  2. test2传递了参数data并选择退出opt

如果仅在更新后才开始失败,则可能是非常受欢迎的错误修复。

  

如果我删除可选参数opt,则可以正常编译。如果我向test1添加一个与test2的数据具有不同等级的data参数,则它可以正常编译。

说得通。如果没有可选参数,则这两个函数在参数数量上是完全明确的。改变论据的排名也会引起差异。

  

如果我在两个函数中都添加了另一个非可选参数,则会收到相同的错误消息。

同样的问题。如果两个函数都有一个额外的非可选参数,且类型一致,则如何解决该调用? 假设新参数为data_extra

print*, Test(param1, param2)
  1. test1传递了参数data_extra并选择加入opt?或者...
  2. test2传递了参数datadata_extra并选择退出opt