1

我开始这个线程是因为我想学习如何成功地使用相同的指针作为不同数组值函数的别名,比如 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
4

1 回答 1

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
于 2013-04-25T03:39:24.137 回答