2013-05-13 130 views
0

我想我可以很容易在这里使用一些帮助,因为我搞乱了一些Fortran 2003,但似乎无法理解如何做到真正的事情。 事实上,我需要编写一个Fortran代码,在模块内声明一个新的数据类型 ,该类型的成员之一是一个指向真实函数的指针。像指向Fortran模块中派生类型的函数

module new_mod 
    type my_type 
    real*8 :: a, b 
    (here something that declares a real*8 function), pointer :: ptr 
    end type my_type 
end module_new 

module funcs 
    real*8 function function1(x) 
    real*8 :: x 
    function1 = x*x 
    end function function1 
    real*8 function function2(x) 
    real*8 :: x 
    function2 = x*x 
    end function function2 
end module funcs 

的东西,然后在主程序中,我想有这样的事情

program my_prog 
    use module_new 
    use module_funcs 
    implicit none 
    real*8 :: y, z 
    type(my_type) :: atom 
    ... 
    atom%ptr => function1 
    y = atom%ptr(x) 
    ... 
    atom%ptr => function2 
    z = atom%ptr(x) 
end program my_prog 

所以主要的想法是,module_new包含有指向一个真正的类型 功能。这个新类型I的对象中的指针必须能够指向主程序中的不同功能。 我已经看到一个人可以用抽象界面等做类似的事情,但老实说,我在这里一团糟。如果有人能帮忙,我会很感激。 干杯......

回答

3

嗯,这是不是真的问题,你会发送到计算器的类型,但实际上你的代码只需要一个“略有改善”(由轻微的适当定义)工作:

module accuracy 
    implicit none 

    integer, parameter :: dp = kind(1.0d0) 

end module accuracy 


module typedef 
    use accuracy 
    implicit none 

    type :: mytype 
    real(dp) :: aa, bb 
    procedure(myinterface), pointer, nopass :: myfunc 
    end type mytype 

    abstract interface 
    function myinterface(xx) 
     import :: dp 
     real(dp), intent(in) :: xx 
     real(dp) :: myinterface 
    end function myinterface 
    end interface 

end module typedef 

module funcs 
    use accuracy 
    implicit none 

contains 

    function func1(xx) 
    real(dp), intent(in) :: xx 
    real(dp) :: func1 

    func1 = xx 

    end function func1 

    function func2(xx) 
    real(dp), intent(in) :: xx 
    real(dp) :: func2 

    func2 = 2.0_dp * xx 

    end function func2 

end module funcs 


program test 
    use accuracy 
    use typedef 
    use funcs 
    implicit none 

    real(dp) :: xx 
    type(mytype) :: atom 

    xx = 12.0_dp 
    atom%myfunc => func1 
    print *, atom%myfunc(xx) 
    atom%myfunc => func2 
    print *, atom%myfunc(xx) 

end program test 

有几件事情是值得提及:

  • 你应该用一个全局参数为你的准确度(见模块accuracy),而忘记了real*8

  • 您的派生类型中的过程指针需要一个接口,该接口在以下abstract interface块中提供(请参阅F2003良好的书中的'抽象接口')。

  • 您需要为派生类型的程序指针nopass选项,因为否则的Fortran假定传递给函数/子程序的第一个参数是派生类型本身(见的好F2003书“类型的约束程序” )。

  • 最后,虽然很明显:如果您认真对待在生产代码中使用它们,您应该阅读一本关于Fortran 2003特性的书。

+0

谢谢!这似乎是伎俩...... – user2378824 2013-05-14 08:18:09

+1

那么你应该接受答案。 – 2013-05-14 11:48:22

相关问题