Я написал набор подпрограмм и скомпилировал их в библиотеку. Эти подпрограммы основаны на некоторой определенной функции (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 аргументом, соответствующим функции (насколько я помню, передача процедуры по аргументу является очень старой функцией Fortran, уже доступной, например, в F66). Конечно, интерфейс asbtract (F2003) является более безопасным решением, которое позволяет избежать неправильной процедуры EvalFunc. –
Спасибо, ребята. Итак, в приведенном выше примере могут быть определены функции f1 и f2 в программе? I.Е если модуль ExampleFuncs был библиотекой/черным ящиком, насколько это касается пользователя, они могли бы определить функцию либо в программе, либо в отдельном модуле? и вызовите ExampleFuncs. Имеет ли это смысл? – user2350366
- 1. Fortran 77 и передачи массива в подпрограмму
- 2. Использование Fortran для вызова функций C++
- 3. Передайте общую переменную в подпрограмму в Fortran
- 4. FORTRAN: передавая фиктивный аргумент в подпрограмму
- 5. Как передать указатель fortran в подпрограмму?
- 6. Fortran: передача произвольных «структур» в подпрограмму модуля
- 7. Используйте подпрограмму Fortran в R? Неопределенный символ
- 8. Как использовать FORtran подпрограмму модуля в с
- 9. Ошибка в fortran, неопределенная ссылка на подпрограмму
- 10. Поле типа fortran как вход в подпрограмму
- 11. Как вызвать и использовать подпрограмму внутри другой подпрограммы в fortran?
- 12. Вызывать параллельную подпрограмму fortran MPI от R
- 13. Указатели функций в fortran
- 14. Использование devenv для передачи переменных препроцессора компилятору Intel Fortran
- 15. Использование var_arg для передачи параметров для вызовов функций
- 16. Перегрузка функций Fortran
- 17. FORTRAN: ошибка сегментации при передаче функций с аргументами массива в подпрограмму
- 18. Аргументы функций Fortran
- 19. Синтаксис дескриптора для передачи функций
- 20. FORTRAN стирает значения arg между вызовами функций?
- 21. Использование Fortran DLL в VB
- 22. Передача строк python в подпрограмму Fortran с использованием ctypes
- 23. Соглашение об именах для передачи хеш-ссылки на подпрограмму
- 24. Как передать массив строк в подпрограмму Fortran с помощью f2py
- 25. Использовать подпрограмму Fortran в R? Ошибка: неправильный тип возвращаемого значения
- 26. Как передать массив (7, 3, 3, 3) в подпрограмму fortran?
- 27. Fortran обертка для функций символов обрезки(), adjustl()
- 28. Вызов функций C из fortran
- 29. Рекурсивный массив возвращаемых функций Fortran?
- 30. «Реальный мир» использования передачи параметров в Fortran
Да, передайте указатель процедуры/функции. См. Http://stackoverflow.com/questions/8612466/how-to-alias-a-function-name-in-fortran –