在编译一些我已经使用了很长时间的代码时,我偶然发现了这个错误。我在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
接口,正如我所说的,它曾经按预期进行编译。
任何帮助表示赞赏!
答案 0 :(得分:3)
Gfortran抱怨界面不明确
好吧,这是因为界面 含糊不清。 在以下调用中应选择哪个过程?
integer :: param
print *, Test(param)
test1
带有参数opt
的选择?或者... test2
传递了参数data
并选择退出opt
?如果仅在更新后才开始失败,则可能是非常受欢迎的错误修复。
如果我删除可选参数opt,则可以正常编译。如果我向test1添加一个与test2的数据具有不同等级的data参数,则它可以正常编译。
说得通。如果没有可选参数,则这两个函数在参数数量上是完全明确的。改变论据的排名也会引起差异。
如果我在两个函数中都添加了另一个非可选参数,则会收到相同的错误消息。
同样的问题。如果两个函数都有一个额外的非可选参数,且类型一致,则如何解决该调用?
假设新参数为data_extra
:
print*, Test(param1, param2)
test1
传递了参数data_extra
并选择加入opt
?或者... test2
传递了参数data
和data_extra
并选择退出opt
?