вызов A (c (x)) выглядит как оцените c (x) и передайте его подпрограмме A, как говорит IanH в своем комментарии.
Если вы хотите передать функцию «C», которая принимает аргумент типа X, подпрограмме A, есть несколько способов сделать это.
Как уже упоминалось, указатели на процедуры - это новый способ. Хотя существует очень мало компиляторов, поддерживающих весь стандарт Fortran 2003, эта часть широко поддерживается.
Вот пример, адаптированный из массивов указателей функций в Фортране
module ProcsMod
implicit none
contains
function f1 (x)
real :: f1
real, intent (in) :: x
f1 = 2.0 * x
return
end function f1
function f2 (x)
real :: f2
real, intent (in) :: x
f2 = 3.0 * x**2
return
end function f2
subroutine fancy (func, x, answer)
real, intent (in) :: x
real, intent (out) :: answer
interface AFunc
function func (y)
real :: func
real, intent (in) ::y
end function func
end interface AFunc
answer = func (x)
end subroutine fancy
end module ProcsMod
program test_proc_ptr
use ProcsMod
implicit none
interface
function func (z)
real :: func
real, intent (in) :: z
end function func
end interface
procedure (func), pointer :: f_ptr => null ()
real :: answer
f_ptr => f1
call fancy (f_ptr, 2.0, answer)
write (*, *) answer
f_ptr => f2
call fancy (f_ptr, 2.0, answer)
write (*, *) answer
stop
end program test_proc_ptr
Вызовы «call fancy (f_ptr, 2.0, answer)» выглядят одинаково, но при изменении функции, на которую указывает указатель функции f_ptr, в подпрограмму fancy передается другая функция.
Это компилируется как с gfortran (версии с 4.4 по 4.7), так и с ifort.
person
M. S. B.
schedule
29.11.2012