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 аргументом, соответствующим функции (насколько я помню, передача процедуры по аргументу является очень старой функцией Fortran, уже доступной, например, в F66). Конечно, интерфейс asbtract (F2003) является более безопасным решением, которое позволяет избежать неправильной процедуры EvalFunc. –

+0

Спасибо, ребята. Итак, в приведенном выше примере могут быть определены функции f1 и f2 в программе? I.Е если модуль ExampleFuncs был библиотекой/черным ящиком, насколько это касается пользователя, они могли бы определить функцию либо в программе, либо в отдельном модуле? и вызовите ExampleFuncs. Имеет ли это смысл? – user2350366

Смежные вопросы