现在我正在用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
请同时阅读这篇文章。
希望有帮助?