我有以下代码:
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>
什么是正确的方法?
谢谢,
塞缪尔
答案 0 :(得分:0)
如果要调用泛型例程,编译器将遍历其所有特定例程,以查找与参数类型匹配的例程。如果找不到,这是您收到的错误消息。
仔细查看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
注意:从你写的内容:
_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)
。