Interface gfortan接口不明确的问题

Interface gfortan接口不明确的问题,interface,fortran,ambiguous,Interface,Fortran,Ambiguous,我的情况类似于以下代码被截取(保存在test.f90中): 因此,该模块定义了具有两种可能实现的通用接口 可以使用ifort和 ifort-c-o“test.o”“test.f90” 创建一个模块。 但是,尝试使用gfortran编译相同的代码: gfortran-c-o“test.o”“test.f90” 导致错误的原因: 15 | subroutine interf1(& | 1 ......

我的情况类似于以下代码被截取(保存在test.f90中):

因此,该模块定义了具有两种可能实现的通用接口

可以使用ifort和

ifort-c-o“test.o”“test.f90”

创建一个模块。 但是,尝试使用gfortran编译相同的代码:

gfortran-c-o“test.o”“test.f90”

导致错误的原因:


   15 |         subroutine interf1(&
      |                          1
......
   32 |         subroutine interf2(&
      |                          2
Error: Ambiguous interfaces in generic interface 'interf' for ‘interf1’ at (1) and ‘interf2’ at (2)
现在看一下实现的虚拟参数,使用 整数数组后跟整数和可选整数数组。 而是使用两个整数数组,后跟一个整数和一个可选数组来调用interf2 整数数组。 所以我不明白这种歧义是从哪里来的,为什么ifort可以编译这个被剪掉的文件,而gfortran却无法编译它

gfortran版本是9.3.0,
如果ORT版本为19.0.5.281

您的程序不符合具有相同通用标识符的规则,gfortran有权拒绝该通用标识符

所考虑的约束是FORTRAN 2018的C1514。让我们仔细看看。没有伪过程或传递的对象伪参数,因此我们只讨论该约束的(1)和(4)。其中一个条件必须通过

第(1)款:

  • 我们在每个过程中都有一个标量参数,在每个过程中称为
    numbers
    。标量参数不能用于消除歧义

  • interf1
    中,两个数组伪参数的(1a)分为1,而每个数组伪参数的(1b)分为3。对于
    interf2
    3个阵列假人的(1a)分数为2,而每个阵列假人的(1b)分数也为2

(1) 这是不符合的

第(4)款:

  • 一个过程中的伪参数与另一个过程中同名的伪参数没有区别
  • interf1
    没有名称未出现在
    interf2
    中的伪参数
  • interf2
    在位置1处具有名称消歧参数
    degeneracies
    ,而其第一个位置消歧参数位于位置2
(4) 这是不符合的

尽管不满足(4),但可以很容易地修改过程定义,使其在参数列表的后面是:move
degeneracies

在您尝试准确地确定如何创建不明确的引用之前,Fortran标准本身有一个重要的注意事项:

这些规则足以确保对符合这些规则的程序的引用是明确的,但仍有一些例子不符合这些规则,但可以证明这些规则是明确的[……] 涵盖所有情况太复杂了,没有用处


好的,谢谢你的澄清。。您建议将
退化项移动到列表的末尾,这就解决了问题。我认为我需要研究这些限制,因为我没有完全意识到它们。然而,我不明白你的计算(1),你能解释一下你是如何获得这些分数的吗?我可以试着解释一下计算过程,但为了清楚起见,你能解释一下你没有得到多少计数吗?好的,我想我只是理解C1514 1的意思)。。因此,为了明确起见:必须为每个伪数据参数计算参数列表中所有TKR兼容非可选伪数据参数的数量(这将为唯一数组1提供interf1),并且必须将其与具有相同类型的所有其他参数列表中的所有伪数据参数的数量进行比较(这会给ICON2提供3)我是对的吗?这是正确的(虽然对于代码< Inter 2/代码>更一般地说,你必须考虑不可区分而不是同一类型——在你的情况下,它们是相同的)。好的,谢谢,我想我已经理解了这个问题以及如何解决它。

   15 |         subroutine interf1(&
      |                          1
......
   32 |         subroutine interf2(&
      |                          2
Error: Ambiguous interfaces in generic interface 'interf' for ‘interf1’ at (1) and ‘interf2’ at (2)