0

当我尝试使用以下模块编译源代码时遇到问题:英特尔 Visual Fortran 编译器会显示运行时错误,说明

error#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
4

1 回答 1

2

在 Fortran 2003 中,默认情况下,接口主体不继承在其主机范围内定义的实体。因此,虽然名称function_template是在主机中定义的(通过第一个接口主体),但它没有在第二个接口主体中定义。

您可以使用 IMPORT 语句从主机导入声明。IMPLICIT NONE 之前的 IMPORT 语句指示来自主机范围的所有实体都由接口主体继承。您可以通过在 import 关键字之后列出相关标识符来限制导入的内容,从样式和代码文档的角度来看,我认为这是一个好主意。

如果 Portland 编译器没有诊断出来,它就是错误的。

(在 Fortran 2008 中,单独模块过程的接口主体确实从它们的主机继承,但这在这里不适用。)

于 2013-07-29T23:45:42.567 回答