微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

gfortan 接口不明确的问题

如何解决gfortan 接口不明确的问题

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

module interfaces_mod

    private
    
    public :: interf

    interface interf
        module procedure interf1
        module procedure interf2
    end interface

    contains
        subroutine interf1(&
                        numbers,&
                        num_numbers,&
                        dense_ranks&
                        )
            Implicit None
            integer,dimension(:),intent(in) :: numbers
            integer,intent(in) :: num_numbers
            integer,intent(out),optional :: dense_ranks
        end subroutine interf1

        subroutine interf2(&
                        degeneracies,&
                        numbers,&
                        dense_ranks&
                        )
            Implicit None
            Integer,intent(inout) :: degeneracies
            integer,intent(in) :: num_numbers
            Integer,optional :: dense_ranks
        end subroutine interf2
end module interfaces_mod

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

这个片段可以使用 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)

现在查看实现的虚拟参数,interf1 被调用 一个整数数组,后跟一个整数和一个可选的整数数组。 interf2 改为使用两个整数数组调用,后跟一个整数和一个可选 整数数组。 所以我不明白歧义从何而来,为什么 ifort 可以编译这个片段而 gfortran 无法编译它。

gfortran 版本是 9.3.0, ifort 版本是 19.0.5.281

解决方法

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

要考虑的约束是 Fortran 2018 的 C1514。让我们仔细看看。没有虚拟过程或传递对象虚拟参数,所以我们归结为该约束的 (1) 和 (4)。这些条件之一必须通过。

对于(1):

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

  • interf1 中,两个数组虚拟参数的 (1a) 得分为 1,而每个数组的 (1b) 得分为 3。对于 interf2,(1a) 得分三个数组虚拟对象的得分为 2,而每个数组的 (1b) 得分也是 2。

(1) 不满足。

对于(4):

  • 一个过程中的虚拟参数不能与另一个过程中的同名参数区分开来。
  • interf1 没有名称未出现在 interf2 中的虚拟参数。
  • interf2 在位置 1 有名称消歧参数 degeneracies,而它的第一个位置消歧参数在位置 2。

(4) 不满足。

虽然不满足 (4),但很容易修改过程定义,使其:将 degeneracies 移到参数列表的后面。

在您尝试弄清楚如何创建模糊引用之前,Fortran 标准本身有一个重要说明:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。