【问题标题】:Pointer to a function inside a derived type on a module in fortran指向 fortran 模块派生类型内的函数的指针
【发布时间】:2013-05-07 21:05:37
【问题描述】:

我想我可以轻松在这里使用一些帮助,因为我在搞乱一些 fortran 2003 但似乎无法真正理解如何做事。 事实是我需要编写一个 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 包含一个类型,该类型具有指向真实的指针 功能。新类型的对象中的这个指针必须能够指向主程序中的不同函数。 我已经看到可以用抽象接口等做类似的事情,但老实说,我在这里一团糟。如果有人可以提供帮助,我将不胜感激。 干杯...

【问题讨论】:

    标签: function pointers types fortran


    【解决方案1】:

    嗯,这并不是您要发送到 stackoverflow 的问题类型,但实际上您的代码只需要“轻微改进”(通过适当的轻微定义)即可工作:

    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 功能,那么您绝对应该阅读一本有关 Fortran 2003 功能的书。

    【讨论】:

      猜你喜欢
      • 2014-02-06
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 2017-07-18
      • 2014-03-06
      • 2017-12-27
      相关资源
      最近更新 更多