2013-04-25 2 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, 당 고정 : OK, 여기에 몇 가지 예제 소스 코드는 여기에

올바른 방향을 설정하는 방법 설정에 함수 포인터의 예입니다 논평. –

+0

신속한 답장을 보내 주셔서 감사합니다. 당신의 예제 코드는 내가 필사적으로 필요로하는 정확한 기능을 가지고있다. –