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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow