나는 일련의 서브 루틴을 작성하여 라이브러리로 컴파일했다. 이 서브 루틴은 정의 된 함수 (x, y)를 기반으로합니다. 현재이 라이브러리 루틴 내부에 묻혀 있습니다. 그러나이 라이브러리에 어떤 함수 (x, y)도 전달할 수 있어야합니다. 가능합니까? 고마워요!fortran을 사용하여 함수를 서브 루틴으로 전달합니다.
답변
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
포인터로 수행 할 필요는 없습니다. 일관된 인터페이스로 해당 가중 인수가 선언 될 때 프로 시저 이름을 직접 전달할 수 있습니다. 그러나 포인터도 작동합니다. –
이것은 추상 인터페이스 없이도 가능합니다. 함수에 해당하는 인수를 EXTERNAL로 선언하는 것만 큼 (필자가 기억하는 한, 인수로 프로 시저를 전달하는 것은 F66에서 이미 사용 가능한 매우 오래된 Fortran 기능입니다). 물론, asbtract 인터페이스 (F2003)는 EvalFunc에 잘못된 프로 시저를 전달하는 것을 피하는 더 안전한 솔루션입니다. –
감사합니다. 그래서 위의 예제에서 함수 f1과 f2가 프로그램에 정의 될 수 있습니까? 즉 exampleFuncs 모듈이 라이브러리/블랙 박스 일 경우 사용자가 염려하는 한 프로그램이나 별도의 모듈에서 함수를 정의 할 수 있습니까? ExampleFuncs를 호출하십시오. 말이 돼? – user2350366
예, 프로 시저/함수 포인터를 전달하십시오. http://stackoverflow.com/questions/8612466/how-to-alias-a-function-name-in-fortran을 참조하십시오. –