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) .



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow