Eine generische Prozedur an eine Funktion als aktuelles Argument übergeben
Ich versuche, eine generische Prozedur als tatsächliches Argument an eine Funktion zu übergeben:
module mymod
implicit none
interface func
module procedure :: func1
module procedure :: func2
endinterface func
contains
real function func1(x)
real,intent(in) :: x
func1 = 2*x
endfunction func1
real function func2(x,y)
real,intent(in) :: x
real,intent(in) :: y
func2 = 2*x + 3*y
endfunction func2
real function func3(func,x,y)
interface
real function func(x,y)
real,intent(in) :: x
real,intent(in) :: y
endfunction func
endinterface
real,intent(in) :: x
real,intent(in) :: y
func3 = func(x,y)
endfunction func3
endmodule mymod
program myprogram
use mymod
implicit none
write(*,*)func3(func,2.,3.)
endprogram myprogram
gfortran 6.2.0 merkt an, dass ich das nicht kann:
test.f90:43:16:
write(*,*)func3(func,2.,3.)
1
Error: GENERIC procedure ‘func’ is not allowed as an actual argument at (1)
Ebenso mit ifort 17:
test.f90(39): error #8164: A generic interface name shall not be used as an actual argument. [FUNC]
write(*,*)func3(func,2.,3.)
----------------^
test.f90(39): error #6637: When a dummy argument is a function, the corresponding actual argument must also be a function. [FUNC]
write(*,*)func3(func,2.,3.)
----------------^
compilation aborted for test.f90 (code 1)
Ich lese den 2008 Standard-Abschnitt über generische Schnittstellen durch und finde keine solche Einschränkung. Ich kann mir auch keinen Grund vorstellen, warum der Compiler die generische Schnittstelle zur Kompilierungszeit nicht auflösen könnte. Mein Bauch sagt mir, dass dies machbar sein sollte, aber ich habe möglicherweise nicht den richtigen Ansatz. Kennen Sie eine standardkonforme Vorgehensweise?