Fortran:指向各种数组值函数的指针

时间:2013-04-25 02:55:30

标签: pointers fortran pass-by-reference fortran95 fortran2003

我正在启动这个线程,因为我想学习如何成功地使用相同的指针作为不同数组值函数的别名,比如f1和f2,顺序。

这是一个不成功的代码来说明我想要的。谢谢。利

PROGRAM main
...
REAL(WP), POINTER, DIMENSION(:) :: p
p=>f1
print*,p(1.0_wp) ! the outcome should be 3
p=>f2
print*,p(2.0_wp) ! the outcome should be 3 1   

CONTAINS

FUNCTION f1(x)
IMPLICIT NONE
REAL(WP), TARGET :: f1
REAL(WP), INTENT(IN) :: x
f1=x+2
END FUNCTION f1    

FUNCTION f2(x)
IMPLICIT NONE
REAL(WP), TARGET :: f2(2)
REAL(WP), INTENT(IN) :: x
f2(1) = x+1
f2(2) = x-1
END FUNCTION f2

END PROGRAM main

1 个答案:

答案 0 :(得分:0)

对于指向返回数组的函数的指针,您希望有一个接口来描述指向返回数组的函数的指针。

以下是如何设置可能将您设置为正确方向的函数指针的示例: How to alias a function name in Fortran

编辑:好的,这是一些示例源代码:

module ExampleFuncs

   implicit none

contains

function f1 (x)
  real, dimension (:), allocatable :: f1
  real, intent (in) :: x

  allocate (f1 (1:2))
  f1 (1) = 2.0 * x
  f1 (2) = -2.0 * x

  return
end function f1


function f2 (x)
   real, dimension (:), allocatable :: f2
   real, intent (in) :: x

   allocate  (f2 (1:3))
   f2 (1) = x
   f2 (2) = x**2
   f2 (3) = x**3

   return
end function f2

end module ExampleFuncs


program test_func_ptrs

   use ExampleFuncs
   implicit none

   abstract interface
      function func (z)
         real, dimension (:), allocatable :: func
         real, intent (in) :: z
      end function func
   end interface

   procedure (func), pointer :: f_ptr

   real :: input

   do

      write (*, '( // "Input test value: ")', advance="no" )
      read (*, *) input

      if ( input < 0.0 ) then
         f_ptr => f1
      else
         f_ptr => f2
      end if

      write (*, '( "evaluate function: ", *(ES14.4) )' )  f_ptr (input)

   end do


end program test_func_ptrs