当我尝试使用以下模块编译源代码时遇到问题:英特尔Visual Fortran编译器会显示运行时错误,说明
错误#8169:未声明指定的接口。 [FUNCTION_TEMPLATE]第15行
虽然Portland Visual Fortran编译器可以在不发出任何警告的情况下运行它。有什么问题?
01 MODULE toolbox
02 IMPLICIT NONE
03 ABSTRACT INTERFACE
04 FUNCTION function_template(x) RESULT(y)
05 IMPLICIT NONE
06 REAL, DIMENSION(:) :: x
07 REAL, DIMENSION(SIZE(x)) :: y
08 END FUNCTION function_template
09
10 FUNCTION penalty_template(x,fvec_p,proc_p) RESULT(y)
11 IMPLICIT NONE
12 REAL, DIMENSION(:) :: x
13 REAL, DIMENSION(:), POINTER :: fvec_p
14 REAL :: y
15 PROCEDURE(function_template), POINTER :: proc_p
16 END FUNCTION penalty_template
17 END INTERFACE
18 CONTAINS
19 ...
20 END MODULE toolbox
答案 0 :(得分:2)
在Fortran 2003中,默认情况下,接口主体不会继承在其主机作用域中定义的实体。因此,虽然在主机中定义了名称function_template
(通过第一个接口主体),但它未在第二个接口主体中定义。
您可以使用IMPORT语句从主机导入声明。 IMPLICIT NONE之前的IMPORT语句指示接口主体继承主机作用域中的所有实体。您可以通过在import关键字后列出相关标识符来限制导入的内容,从样式和代码文档的角度来看,我认为这是一个好主意。
如果没有诊断出这个,那么Portland编译器会出错。
(在Fortran 2008中,单独模块过程的接口主体确实从其主机继承,但这不适用于此。)