2014-02-12 3 views
1

나는 일련의 서브 루틴을 작성하여 라이브러리로 컴파일했다. 이 서브 루틴은 정의 된 함수 (x, y)를 기반으로합니다. 현재이 라이브러리 루틴 내부에 묻혀 있습니다. 그러나이 라이브러리에 어떤 함수 (x, y)도 전달할 수 있어야합니다. 가능합니까? 고마워요!fortran을 사용하여 함수를 서브 루틴으로 전달합니다.

+1

예, 프로 시저/함수 포인터를 전달하십시오. http://stackoverflow.com/questions/8612466/how-to-alias-a-function-name-in-fortran을 참조하십시오. –

답변

1
module ExampleFuncs 

    implicit none 

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


contains 


subroutine EvalFunc (aFunc_ptr, x) 

    procedure (func), pointer :: aFunc_ptr 
    real, intent (in) :: x 

    write (*, *) "answer:", aFunc_ptr (x) 

end subroutine EvalFunc 


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

    f1 = 2.0 * x 

end function f1 


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

    f2 = 3.0 * x**2 

end function f2 

end module ExampleFuncs 


program Func_to_Sub 

    use ExampleFuncs 

    implicit none 

    procedure (func), pointer :: f_ptr => null() 

    f_ptr => f1 
    call EvalFunc (f_ptr, 2.0) 

    f_ptr => f2 
    call EvalFunc (f_ptr, 2.0) 

    stop 

end program Func_to_Sub 
+0

포인터로 수행 할 필요는 없습니다. 일관된 인터페이스로 해당 가중 인수가 선언 될 때 프로 시저 이름을 직접 전달할 수 있습니다. 그러나 포인터도 작동합니다. –

+0

이것은 추상 인터페이스 없이도 가능합니다. 함수에 해당하는 인수를 EXTERNAL로 선언하는 것만 큼 (필자가 기억하는 한, 인수로 프로 시저를 전달하는 것은 F66에서 이미 사용 가능한 매우 오래된 Fortran 기능입니다). 물론, asbtract 인터페이스 (F2003)는 EvalFunc에 잘못된 프로 시저를 전달하는 것을 피하는 더 안전한 솔루션입니다. –

+0

감사합니다. 그래서 위의 예제에서 함수 f1과 f2가 프로그램에 정의 될 수 있습니까? 즉 exampleFuncs 모듈이 라이브러리/블랙 박스 일 경우 사용자가 염려하는 한 프로그램이나 별도의 모듈에서 함수를 정의 할 수 있습니까? ExampleFuncs를 호출하십시오. 말이 돼? – user2350366