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