IanH がコメントで述べているように、 call A(c(x)) は evaluate c(x) のように見え、それをサブルーチン A に渡します。
X などの型の引数を取る関数 "C" をサブルーチン A に渡したい場合は、いくつかの方法があります。
すでに述べたように、プロシージャ ポインタは新しい方法です。Fortran 2003 標準をすべてサポートするコンパイラはほとんどありませんが、この部分は広くサポートされています。
これは、 Fortran の関数ポインター配列から適用された例です。
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 の両方でコンパイルされます。