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



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

当我用一个可选参数定义一个接口时,该接口有不同数量的非可选参数,Gfortran会抱怨该接口不明确。例如,如果我编译以下内容,我会得到"(1(处的'testinit1'和(2(处的'stestnit2'的通用接口'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,那么它编译得很好。如果我向test1添加一个与test2的数据具有不同秩的data参数,那么它编译得很好。如果我向这两个函数添加另一个非可选参数,我会得到相同的错误消息。

我偶然发现的实际代码是该文件中的Result接口,正如我所说,它用于按预期进行编译。

感谢您的帮助!

Gfortran抱怨接口不明确

好吧,那是因为接口是不明确的。在以下调用中应选择哪种程序?

integer :: param
print *, Test(param)
  1. 选择了参数opttest1?或者
  2. 传递了参数dataopt选择退出的test2

如果它只是在更新后才开始失败,那可能是一个非常受欢迎的错误修复。

如果我删除可选参数opt,那么它编译得很好。如果我向test1添加一个与test2的数据具有不同等级的数据参数,那么它编译得很好。

很有道理。如果没有可选参数,两个函数的参数数量都是完全明确的。改变论点的等级也会引起差异。

如果我向两个函数添加另一个非可选参数,我会得到相同的错误消息。

同样的问题。如果这两个函数都有一个额外的非可选参数,并且具有类型-种类-秩一致性,您将如何解决该调用?假设新的自变量是data_extra:

print*, Test(param1, param2)
  1. 传递了参数data_extra而选择了opttest1?或者
  2. 参数为datadata_extratest2通过,而opt选择退出

最新更新