Fortran
C-Interoperabilität
Suche…
C von Fortran aus anrufen
Fortran 2003 hat Sprachfunktionen eingeführt, die die Interoperabilität zwischen C und Fortran (und mehr Sprachen durch Verwendung von C als Vermittler) gewährleisten können. Auf diese Funktionen wird meist über das intrinsische Modul iso_c_binding
:
use, intrinsic :: iso_c_binding
Das Schlüsselwort intrinsic
hier stellt sicher, dass das richtige Modul verwendet wird und nicht ein vom Benutzer erstelltes Modul mit demselben Namen.
iso_c_binding
den Zugriff auf interoperable Typparameter:
integer(c_int) :: foo ! equivalent of 'int foo' in C
real(c_float) :: bar ! equivalent of 'float bar' in C
Die Verwendung von C-Typ-Parametern gewährleistet, dass die Daten zwischen C- und Fortran-Programmen übertragen werden können.
Die Interoperabilität von C-Char- und Fortran-Zeichen ist wahrscheinlich ein Thema für sich und wird hier nicht diskutiert
Um eine C-Funktion tatsächlich von Fortran aufzurufen, muss zunächst die Schnittstelle deklariert werden. Dies entspricht im Wesentlichen dem Prototyp der C-Funktion und teilt dem Compiler die Anzahl und den Typ der Argumente usw. mit. Mit dem bind
Attribut wird dem Compiler der Name der Funktion in C mitgeteilt, die sich vom Fortran unterscheiden kann Name.
Gänse
// Count how many geese are in a given flock
int howManyGeese(int flock);
Gänse.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
Das Fortran-Programm muss mit der C-Bibliothek ( compilerabhängig, hier einschließen? ) howManyGeese()
, die die Implementierung von howManyGeese()
. Anschließend kann how_many_geese()
von Fortran aufgerufen werden.
C-Strukturen in Fortran
Das bind
Attribut kann auch auf abgeleitete Typen angewendet werden:
Gänse
struct Goose {
int flock;
float buoyancy;
}
struct Goose goose_c;
Gänse.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
Daten können nun zwischen goose_c
und goose_f
. C-Routinen, die Argumente des Typs Goose
annehmen, können von Fortran mit type(goose_t)
.