Oop 现代Fortran中的面向对象编程,包括函数指针成员
现在我正在用FORTRAN培训面向对象编程,我想用一个包含函数指针的“类型”编写一个程序,如下所示代码。但是,“英特尔Fortran编译器”(v18)显示编译错误,并表示函数trig(self,x)中的第一个参数应与类型绑定过程(包括传递绑定属性)中定义的类型相同 我还不熟悉“现代”fortran编程,所以我无法理解这个编译错误的含义。你能提供你的专业知识吗Oop 现代Fortran中的面向对象编程,包括函数指针成员,oop,fortran,Oop,Fortran,现在我正在用FORTRAN培训面向对象编程,我想用一个包含函数指针的“类型”编写一个程序,如下所示代码。但是,“英特尔Fortran编译器”(v18)显示编译错误,并表示函数trig(self,x)中的第一个参数应与类型绑定过程(包括传递绑定属性)中定义的类型相同 我还不熟悉“现代”fortran编程,所以我无法理解这个编译错误的含义。你能提供你的专业知识吗 MODULE test_mod ! use iso_fortran_env, only: REAL32, REAL64 !
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
使用“英特尔Fortran”编译代码时会显示此错误消息 错误#8262:对于具有PASS binding属性的类型绑定过程,第一个伪参数必须具有与所定义类型相同的声明类型。[自我] 与抽象界面中的函数
trig(self,x)
相关
正如francescalus所提到的,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
请也读一下这个
希望有帮助?请显示编译器的确切错误(和位置)。不过,至少你需要一个statement@kachigusa当前位置francescalus的提示解决了您的问题。我非常抱歉延迟回复,但我真的非常感谢您善意的评论和测试。实际上,我得到的错误消息与您显示的错误消息相同。因为我不知道进口声明,你的建议很有用,我可以解决我的问题。非常感谢你。