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



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow