Interface 如何在Fortran中访问私有公共接口?
我有以下代码:Interface 如何在Fortran中访问私有公共接口?,interface,compilation,fortran,private,public,Interface,Compilation,Fortran,Private,Public,我有以下代码: SUBROUTINE test USE mp, only: mp_bcast integer :: B = 0 logical :: A ... CALL mp_bcast (A, B) END SUBROUTINE test 问题在于,模块mp如下所示: MODULE mp IMPLICIT NONE PRIVATE PUBLIC :: mp_bcast ! INTERFACE mp_bcast MODULE PROCEDURE mp_bcast_i1, mp_bcas
SUBROUTINE test
USE mp, only: mp_bcast
integer :: B = 0
logical :: A
...
CALL mp_bcast (A, B)
END SUBROUTINE test
问题在于,模块mp如下所示:
MODULE mp
IMPLICIT NONE
PRIVATE
PUBLIC :: mp_bcast
!
INTERFACE mp_bcast
MODULE PROCEDURE mp_bcast_i1, mp_bcast_r1, mp_bcast_c1, mp_bcast_l ! etc
END INTERFACE
SUBROUTINE mp_bcast_l(msg,source,gid)
IMPLICIT NONE
LOGICAL :: msg
INTEGER, INTENT(IN) :: source
INTEGER, INTENT(IN) :: gid
END SUBROUTINE mp_bcast_l
它是私有的,但接口是公共的。我无法修改模块mp(属于我要连接的另一个软件)
我使用以下生成文件:
MODS = ../../Modules_mp/libmod.a
prog : prog.o test.o $(LD) $(LDFLAGS) -o prog.x $(MODS)
通过这种方式,我认为我可以访问包含模块“mp”的模块libmod.a中的公共接口。
它不起作用,我收到以下错误:
test.f90(38): error #6285: There is no matching specific subroutine for this generic subroutine call. [MP_BCAST]
CALL mp_bcast (A,B)
-------^
正确的方法是什么
谢谢,
Samuel如果调用的是泛型例程,编译器将遍历其所有特定例程,以找到与参数类型匹配的例程。如果找不到,这是您收到的错误消息 仔细查看您的
a
和B
是什么类型,并查看其中一个特定例程是否与之匹配
因更多信息而更新
您认为匹配的特定子例程有三个伪参数(一个逻辑参数,两个整数),但您只提供了两个(逻辑参数和一个整数)
注意:下面是我的原始答案,一些人对此发表了评论,所以我将保留它
可能A
的类型为REAL
,而B
的类型为INTEGER
,因此编译器将搜索一个特定的例程,该例程按该顺序有一个REAL
和一个INTEGER
,但没有找到。在这种情况下,可能需要转换其中一个变量,如下所示:
CALL mp_bcast(A, float(B))
注意:根据您所写内容:
MODULE PROCEDURE mp_bcast_i1, mp_bcast_r1, mp_bcast_c1 ! etc
我推断,
\u i1
可能代表整数(KIND=1)
,等等,尽管我不认为有什么是实(KIND=1)
您对private和public的使用是正确的,错误消息的文本也是正确的。问题似乎是您的调用只有两个参数。下面是一个使用genericswap.f90的示例(在线提供,无需添加我添加的PRIVATE
和PUBLIC swap
):
编译器将查看列出的模块过程,并确定与签名匹配的模块过程。您的列表mp\u bcast\u i1、mp\u bcast\u r1、mp\u bcast\u c1、mp\u bcast\u l
似乎与(A、B)
(无论是何种类型)不匹配。我不能完全肯定,因为您只给出了一个例程的源代码
我知道这是一篇老文章,但我只是想确保这些信息对其他走上这条道路的人有用。可能还需要检查正在使用的编译器实现了什么。在我的例子中,我使用的是
gfortran 7.1.0版(Ubuntu 7.1.0-5ubuntu2~16.04)
,从错误消息中可以看出,问题在于您调用的mp_bcast
参数类型错误,也就是说,没有任何程序可以处理子例程test
调用的A
和B
mp\u bcast
实际上在模块mp
中是公共的,因此,您必须提供更多的上下文。我认为您缺少第三个参数。第二个和第三个参数似乎是该接口下所有过程的整数。哦,你是对的!在QE4版本中,gid是可选的,但不再是了!非常感谢。我猜这就是相关的源文件。如果是这样的话,数字1表示一个标量,而不是种类。我同意这个答案,但是,说实话,我不认为真的存在(种类=1)是一个非常依赖于编译器的语句。对于目前广泛使用的至少一个编译器来说是错误的。它确实来自QE源代码。我已经更新了问题。子程序“mp_bcast_l”应该匹配,但我仍然有编译问题。您好,不要使用设置代码块格式。使用编辑器中添加4个缩进空格的图标。
module swap_module
implicit none
PRIVATE
PUBLIC swap
interface swap
module procedure swap_reals, swap_integers
end interface