使用指针来参数化函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用指针来参数化函数相关的知识,希望对你有一定的参考价值。

我有一个函数(y = f(x,a)= x ^ a),它有两个输入参数。我想将f(x,a)减少到f(x),使f内置于其中。

目前,我可以使用下面提供的模块和程序示例创建指向函数的指针。我想要做的是以某种方式使用参数初始化指针,以便不使用2个参数调用函数,而是只使用一个。

我需要参数化函数调用,以便以后在其他例程中使用(例如集成,区分等)

这是否可以使用抽象接口,函数,子例程和指针的某种组合?

module example
  implicit none

  abstract interface
    pure function fun1(x) result(y)
      real, intent(in):: x
      real:: y
    end function fun1

    pure function fun2(x, a) result(y)
      real, intent(in):: x, a
      real:: y
    end function fun2
  end interface

contains

  pure function myfun(xx, aa) result(yy)
    real, intent(in):: xx, aa
    real:: yy
    yy = xx**aa
    return
  end function myfun

end module example


program test_ptr
  use example, only: fun1, fun2, myfun
  implicit none

  real:: x, a, y
  procedure(fun2), pointer :: ptr => null()

  x = 2.0
  a = 1.5

  ptr => myfun
  y = ptr(x, a)

  write(*,*) x, '^', a, ' = ', y

end program test_ptr
答案

编辑:我以为我搞清楚了,但是在第一次调用函数后指针被销毁了。多次调用指针会导致Seg Fault。

在我的问题之前,我正在玩我的来源,看看我是否能够自己得到它,我想我已经弄明白了。我想出了两种方法来做我需要的东西,第一种是使用带内部函数的函数,第二种是使用子程序,也有内部函数。

它们都依赖于内部函数可以访问“父”函数/子例程的变量这一事实

我仍然想知道是否可以使用外部函数执行此操作,或者唯一的方法是使用内部函数。

如果有人有一些意见,我很乐意听到。

编辑:显然你也可以从内部函数调用外部函数,从而只是创建一个已知函数的包装器。

module example
  implicit none

  abstract interface
    pure function fun1(x) result(y)
      real, intent(in):: x
      real:: y
    end function fun1

    pure function fun2(x, a) result(y)
      real, intent(in):: x, a
      real:: y
    end function fun2
  end interface

contains

  pure function myfun(xx, aa) result(yy)
    real, intent(in):: xx, aa
    real:: yy
    yy = xx**aa
    return
  end function myfun

  pure function set_ptr(aa) result(ptr)
    real, intent(in):: aa
    procedure(fun1), pointer :: ptr
    ptr => localfun
    return
  contains
    pure function localfun(xx) result(yy)
      real, intent(in):: xx
      real:: yy
      yy = xx**aa
    end function localfun
  end function set_ptr

  pure subroutine mysub(aa, ptr)
    real, intent(in):: aa
    procedure(fun1), intent(out), pointer :: ptr
    ptr => localfun
    return
  contains
    pure function localfun(xx) result(yy)
      real, intent(in):: xx
      real:: yy
      yy = xx**aa
    end function localfun
  end subroutine mysub

  pure function set_ptr2(aa) result(ptr)
    real, intent(in):: aa
    procedure(fun1), pointer :: ptr
    ptr => myfun_wrapper
    return
  contains
    pure function myfun_wrapper(xx) result(yy)
      real, intent(in):: xx
      real:: yy
      yy = myfun(xx, aa)
    end function myfun_wrapper
  end function set_ptr2

end module example



program test_ptr
  use example, only: fun1, fun2, myfun, mysub, set_ptr, set_ptr2
  implicit none

  real:: x, a, y
  procedure(fun2), pointer :: ptr1 => null()
  procedure(fun1), pointer :: ptr2 => null()
  procedure(fun1), pointer :: ptr3 => null()
  procedure(fun1), pointer :: ptr4 => null()

  x = 2.0
  a = 1.5

  ptr1 => myfun
  y = ptr1(x, a)
  write(*,*) x, '^', a, ' = ', y

  ptr2 = set_ptr(a)
  y = ptr2(x)
  write(*,*) x, '^', a, ' = ', y

  call mysub(a, ptr3)
  y = ptr3(x)
  write(*,*) x, '^', a, ' = ', y

  ptr4 = set_ptr2(a)
  y = ptr4(x)
  write(*,*) x, '^', a, ' = ', y

*** The next line will result in an error ***
  y = ptr4(x)
  write(*,*) x, '^', a, ' = ', y

end program test_ptr

以上是关于使用指针来参数化函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 使用指向相同函数的指针作为模板参数是不是总是会导致相同的实例化?

使用 std::thread 函数 C++11 将指针作为参数传递

创建片段而不从 java 代码实例化它

模板化方法指针 - 无法匹配函数参数的指针

将 lambda 作为模板参数传递给函数指针函数模板化

使用 ctypes 传递结构指针