IVF和PVF编译器的分歧结果

时间:2013-07-29 19:37:11

标签: fortran procedure

当我尝试使用以下模块编译源代码时遇到问题:英特尔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

1 个答案:

答案 0 :(得分:2)

在Fortran 2003中,默认情况下,接口主体不会继承在其主机作用域中定义的实体。因此,虽然在主机中定义了名称function_template(通过第一个接口主体),但它未在第二个接口主体中定义。

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

如果没有诊断出这个,​​那么Portland编译器会出错。

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