现代Fortran中的面向对象编程,包括函数指针的成员



现在我正在用FORTRAN训练面向对象编程,我想用一个包含函数指针的"类型"来制作一个程序,如下所示。然而,英特尔Fortran编译器(v18(显示了编译错误,并表示FUNCTION trig(self,x(中的第一个参数应该与类型绑定过程中定义的类型相同,包括传递绑定属性。

我还不熟悉"现代"fortran编程,所以我无法理解这个编译错误的含义。你能借用你的专业知识吗?

MODULE test_mod
!
use iso_fortran_env, only: REAL32, REAL64
!
implicit none
!
private
!
integer, parameter, private :: sp = REAL32
integer, parameter, private :: dp = REAL64
!
type, public :: t_obj
private
real( dp ) :: val = 1.0_dp
procedure( trig ), pass( self ), pointer, public :: trigFunc => null( )
contains
private
procedure, pass( self ), public :: setFunc
end type t_obj
!
ABSTRACT INTERFACE
FUNCTION trig( self, x )
class( t_obj )                      :: self
real( kind( 1.0d0 ) ), intent( in ) :: x
real( kind( 1.0d0 ) )               :: trig
END FUNCTION trig
END INTERFACE
!
CONTAINS
!
FUNCTION cosFunc( self, x )
implicit none
class( t_obj ) :: self
real( dp )     :: x
real( dp )     :: cosFunc
cosFunc = cos( x ) * self%val
END FUNCTION cosFunc
!
FUNCTION sinFunc( self, x )
implicit none
class( t_obj ) :: self
real( dp )     :: x
real( dp )     :: sinFunc
sinFunc = sin( x ) * self%val
END FUNCTION sinFunc
!
SUBROUTINE setFunc( self, i )
implicit none
class( t_obj ), intent( inout ) :: self
integer :: i
if( i .eq. 1 ) then
self%trigFunc => cosFunc
else
self%trigFunc => sinFunc
end if
END SUBROUTINE setFunc
!
END MODULE test_mod
!
PROGRAM test_main
!
use test_mod
!
implicit none
type( t_obj )         :: obj
real( kind( 1.0d0 ) ) :: pihalf = datan( 1.0d0 ) * 2.0d0
!
call obj%setFunc( 1 )
write(*,*) obj%trigFunc( pihalf )
call obj%setFunc( 0 )
write(*,*) obj%trigFunc( pihalf )
!
END PROGRAM test_main

使用INTEL Fortran编译代码时,会出现以下错误消息

错误#8262:对于具有PASS绑定属性的类型绑定过程,第一个伪参数必须具有与所定义类型相同的声明类型。[自身]

与抽象接口中的函数trig( self, x )相关。

正如franciscolus所提到的,函数中缺少import语句。

添加它将解决您的问题:

ABSTRACT INTERFACE
FUNCTION trig( self, x )
import
class( t_obj )                      :: self
real( kind( 1.0d0 ) ), intent( in ) :: x
real( kind( 1.0d0 ) )               :: trig
END FUNCTION trig
END INTERFACE

请同时阅读这篇文章。

希望有帮助?

最新更新