Ricerca…


Chiamando C da Fortran

Fortran 2003 ha introdotto caratteristiche linguistiche che possono garantire l'interoperabilità tra C e Fortran (e in più lingue usando C come intermediario). Queste funzionalità sono per lo più accessibili tramite il modulo intrinseco iso_c_binding :

use, intrinsic :: iso_c_binding

La parola chiave intrinsic garantisce che venga utilizzato il modulo corretto e non un modulo creato dall'utente con lo stesso nome.

iso_c_binding fornisce l'accesso a parametri di tipo di tipo interoperabile :

integer(c_int) :: foo    ! equivalent of 'int foo' in C
real(c_float) :: bar     ! equivalent of 'float bar' in C

L'uso di parametri di tipo C garantisce che i dati possano essere trasferiti tra i programmi C e Fortran.

L'interoperabilità dei caratteri C char e Fortran è probabilmente un argomento per sé e quindi non è discussa qui


Per chiamare effettivamente una funzione C da Fortran, prima l'interfaccia deve essere dichiarata. Questo è sostanzialmente equivalente al prototipo della funzione C, e consente al compilatore di conoscere il numero e il tipo degli argomenti, ecc. L'attributo bind viene usato per indicare al compilatore il nome della funzione in C, che potrebbe essere diverso dal Fortran nome.

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

Il programma Fortran deve essere collegato alla libreria C ( dipendente dal compilatore, includi qui? ) Che include l'implementazione di howManyGeese() , quindi how_many_geese() può essere chiamato da Fortran.

C structs in Fortran

L'attributo bind può anche essere applicato ai tipi derivati:

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

Ora i dati possono essere trasferiti tra goose_c e goose_f . Le routine C che accettano argomenti di tipo Goose possono essere chiamate da Fortran con type(goose_t) .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow