如何访问Fortran中的PRIVATE PUBLIC接口?

时间:2015-05-15 11:22:34

标签: interface compilation fortran private public

我有以下代码:

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(属于我想要连接的另一个软件)。

我使用以下Makefile:

test.f90(38): error #6285: There is no matching specific subroutine for this generic subroutine call.   [MP_BCAST]
  CALL mp_bcast (A,B)
-------^

这样我虽然可以访问包含模块'mp'的模块libmod.a中的公共接口。 它不起作用,我收到此错误:

<script type="text/javascript" src="lib/bootstrap/dist/js/bootstrap.js"></script>

什么是正确的方法?

谢谢,

塞缪尔

2 个答案:

答案 0 :(得分:0)

如果要调用泛型例程,编译器将遍历其所有特定例程,以查找与参数类型匹配的例程。如果找不到,这是您收到的错误消息。

仔细查看AB的类型,并查看其中一个特定例程是否与之匹配。

因更多信息而更新

您认为匹配的特定子例程有三个伪参数(一个逻辑,两个整数),但您只提供两个(逻辑和一个整数)。

注意:下面是我的原始答案,有些人评论过,所以我会留下它。

可能A的类型为REALB的类型为INTEGER,因此编译器会搜索具有一个REAL和一个INTEGER的特定例程CALL mp_bcast(A, float(B)) 按此顺序,但找不到一个。在这种情况下,可能需要转换其中一个变量,如:

MODULE PROCEDURE mp_bcast_i1, mp_bcast_r1, mp_bcast_c1  ! etc

注意:从你写的内容:

_i1

我推断INTEGER(KIND=1)可能代表REAL(KIND=1),等等,尽管我认为不存在newBoatAlert.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput; UITextField * alertTextField1 = [newBoatAlert textFieldAtIndex:0]; alertTextField1.keyboardType = UIKeyboardTypeDefault; alertTextField1.placeholder = @"Name"; UITextField * alertTextField2 = [newBoatAlert textFieldAtIndex:1]; alertTextField2.frame=CGRectMake(alertTextField1.frame.origin.x, alertTextField1.frame.origin.y+alertTextField1.frame.size.height+10, alertTextField1.frame.size.width, alertTextField1.frame.size.height+40); alertTextField2.keyboardType = UIKeyboardTypeDefault; alertTextField2.placeholder = @"Description"; alertTextField2.secureTextEntry=NO; 这样的事情。

答案 1 :(得分:0)

您对私有和公共的使用是正确的,错误消息的文本也是如此。问题似乎是只有两个参数的调用。以下是使用genericswap.f90的示例(在线提供,但未添加<specialty>Family Medicine, Geriatric Medicine</specialty> <specialty>Medical Oncology, Surgery - Breast</specialty> <specialty>Emergency Medicine, Family Medicine</specialty> <specialty>Internal Medicine, Pediatric - General</specialty> <specialty>Emergency Medicine, Family Medicine</specialty> <specialty>Orthopedics - General, Orthopedics - Sports Medicine</specialty> <specialty>Family Medicine, Urgent Care/Immediate Care</specialty> <specialty>Family Medicine, Internal Medicine, Pediatric - General</specialty> <specialty>Family Medicine, Sports Medicine</specialty> <specialty>Cardiology, Cardiology - Adv Heart Failure/Transplant</specialty> <specialty>Cardiology, Cardiology - Non-Invasive</specialty> <specialty>Pediatric - Developmental/Behavioral, Pediatric – Neurodevelopment Disabilities </specialty> <specialty>Pediatric - Critical Care Medicine, Pediatric - Intensivist </specialty> <specialty>Family Medicine, Internal Medicine, Urgent Care/Immediate Care </specialty> <specialty>Family Medicine, Urgent Care/Immediate Care</specialty> PRIVATE我已添加):

PUBLIC swap

编译器将查看列出的模块过程并识别与签名匹配的过程。您的列表module swap_module implicit none PRIVATE PUBLIC swap interface swap module procedure swap_reals, swap_integers end interface 似乎与mp_bcast_i1, mp_bcast_r1, mp_bcast_c1, mp_bcast_l不匹配(无论它们是什么类型)。我无法完全确定,因为您只提供了一个例程的来源。

我知道这是一篇旧帖子,但我只是想确保其他人在这条路上漫步时可以获得这些信息。可能还需要检查您正在使用的编译器实现的内容。在我的情况下,我使用(A,B)