Fortran
C interoperabilitet
Sök…
Ringer C från Fortran
Fortran 2003 introducerade språkfunktioner som kan garantera interoperabilitet mellan C och Fortran (och till fler språk genom att använda C som mellanhand). Dessa funktioner nås mestadels via den intrinsiska modulen iso_c_binding
:
use, intrinsic :: iso_c_binding
Det intrinsic
nyckelordet här säkerställer att rätt modul används och inte en användarskapad modul med samma namn.
iso_c_binding
ger åtkomst till interoperabla typparametrar:
integer(c_int) :: foo ! equivalent of 'int foo' in C
real(c_float) :: bar ! equivalent of 'float bar' in C
Användning av C-typparametrar garanterar att data kan överföras mellan C- och Fortran-program.
Interoperabilitet mellan C-char och Fortran-karaktärer är förmodligen ett ämne för sig själv och diskuteras inte här
För att faktiskt ringa en C-funktion från Fortran måste först gränssnittet deklareras. Detta är i huvudsak ekvivalent med prototypen C-funktion och låter kompilatorn veta om antalet och typen av argument, etc. bind
används för att berätta kompilatorn namnet på funktionen i C, vilket kan skilja sig från Fortran namn.
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
Fortran-programmet måste vara länkat mot C-biblioteket ( kompilatorberoende, inkludera här? ) howManyGeese()
inkluderar implementeringen av howManyGeese()
och sedan how_many_geese()
kan kallas från Fortran.
C-strukturer i Fortran
bind
kan också tillämpas på härledda typer:
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
Data kan nu överföras mellan goose_c
och goose_f
. C-rutiner som tar argument av typ Goose
kan kallas från Fortran med type(goose_t)
.