2013-04-25 66 views
1

我開始這個線程是因爲我想學習如何成功地使用相同的指針來順序地用作不同數組值函數的別名,比如說f1和f2。Fortran:指向各種數組值函數的指針

這是一個不成功的代碼來說明我想要的。謝謝。 Lee

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 

回答

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 
+0

OK,固定每評論。 – 2013-04-25 07:02:08

+0

感謝您的及時回覆。您的示例代碼具有我非常需要的確切功能。 – 2013-04-26 03:11:18