Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 现代Fortran中的面向对象编程,包括函数指针成员_Oop_Fortran - Fatal编程技术网

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

Oop 现代Fortran中的面向对象编程,包括函数指针成员,oop,fortran,Oop,Fortran,现在我正在用FORTRAN培训面向对象编程,我想用一个包含函数指针的“类型”编写一个程序,如下所示代码。但是,“英特尔Fortran编译器”(v18)显示编译错误,并表示函数trig(self,x)中的第一个参数应与类型绑定过程(包括传递绑定属性)中定义的类型相同 我还不熟悉“现代”fortran编程,所以我无法理解这个编译错误的含义。你能提供你的专业知识吗 MODULE test_mod ! use iso_fortran_env, only: REAL32, REAL64 !

现在我正在用FORTRAN培训面向对象编程,我想用一个包含函数指针的“类型”编写一个程序,如下所示代码。但是,“英特尔Fortran编译器”(v18)显示编译错误,并表示函数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

使用“英特尔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的提示解决了您的问题。我非常抱歉延迟回复,但我真的非常感谢您善意的评论和测试。实际上,我得到的错误消息与您显示的错误消息相同。因为我不知道进口声明,你的建议很有用,我可以解决我的问题。非常感谢你。