如何解决gfortan 接口不明确的问题
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 举报,一经查实,本站将立刻删除。