Fortran
C interoperabiliteit
Zoeken…
Bellen vanuit Fortran
Fortran 2003 introduceerde taalfuncties die interoperabiliteit tussen C en Fortran kunnen garanderen (en naar meer talen door C als intermediair te gebruiken). Deze functies zijn meestal toegankelijk via de intrinsieke module iso_c_binding
:
use, intrinsic :: iso_c_binding
Het intrinsic
trefwoord hier zorgt ervoor dat de juiste module wordt gebruikt, en niet een door de gebruiker gemaakte module met dezelfde naam.
iso_c_binding
geeft toegang tot interoperabele soort type parameters:
integer(c_int) :: foo ! equivalent of 'int foo' in C
real(c_float) :: bar ! equivalent of 'float bar' in C
Het gebruik van parameters van het type C garandeert dat de gegevens kunnen worden overgedragen tussen C- en Fortran-programma's.
Interoperabiliteit van C char en Fortran-personages is waarschijnlijk een onderwerp op zich en wordt hier dus niet besproken
Om een C-functie vanuit Fortran daadwerkelijk aan te roepen, moet eerst de interface worden gedeclareerd. Dit is in wezen gelijk aan het prototype van de C-functie en laat de compiler weten over het aantal en het type van de argumenten, enz. Het kenmerk bind
wordt gebruikt om de compiler de naam van de functie in C te vertellen, die kan verschillen van de Fortran naam.
geese.h
// Count how many geese are in a given flock
int howManyGeese(int flock);
geese.f90
! Interface to C routine
interface
integer(c_int) function how_many_geese(flock_num) bind(C, 'howManyGeese')
! Interface blocks don't know about their context,
! so we need to use iso_c_binding to get c_int definition
use, intrinsic :: iso_c_binding, only : c_int
integer(c_int) :: flock_num
end function how_many_geese
end interface
Het Fortran-programma moet worden gekoppeld aan de C-bibliotheek ( afhankelijk van de compiler, hier opnemen? ) Met de implementatie van howManyGeese()
en vervolgens how_many_geese()
kan worden opgeroepen vanuit Fortran.
C structs in Fortran
Het bind
kan ook worden toegepast op afgeleide typen:
geese.h
struct Goose {
int flock;
float buoyancy;
}
struct Goose goose_c;
geese.f90
use, intrinsic :: iso_c_binding, only : c_int, c_float
type, bind(C) :: goose_t
integer(c_int) :: flock
real(c_float) :: buoyancy
end type goose_t
type(goose_t) :: goose_f
Gegevens kunnen nu worden overgedragen tussen goose_c
en goose_f
. C-routines die argumenten van het type Goose
aannemen, kunnen vanuit Fortran met type(goose_t)
worden aangeroepen.