Szukaj…


Dzwonię do C z Fortranu

Fortran 2003 wprowadził funkcje językowe, które mogą zagwarantować interoperacyjność między C a Fortranem (i większą liczbą języków, używając C jako pośrednika). Te funkcje są dostępne głównie poprzez wewnętrzny moduł iso_c_binding :

use, intrinsic :: iso_c_binding

intrinsic słowo kluczowe zapewnia, że użyto poprawnego modułu, a nie moduł utworzony przez użytkownika o tej samej nazwie.

iso_c_binding daje dostęp do parametrów rodzaju rodzaju interoperacyjnego :

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

Zastosowanie parametrów typu C gwarantuje, że dane mogą być przesyłane między programami C i Fortran.

Interoperacyjność znaków C i Fortran jest prawdopodobnie tematem dla siebie i dlatego nie została tutaj omówiona


Aby faktycznie wywołać funkcję C z Fortran, najpierw należy zadeklarować interfejs. Jest to zasadniczo odpowiednik prototypu funkcji C i pozwala kompilatorowi wiedzieć o liczbie i typach argumentów itp. Atrybut bind służy do informowania kompilatora o nazwie funkcji w C, która może być inna niż Fortran Nazwa.

gęsi. h

// Count how many geese are in a given flock
int howManyGeese(int flock);

gęsi.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

Program Fortran musi być połączony z biblioteką C ( zależną od kompilatora, howManyGeese() tutaj? ), howManyGeese() obejmuje implementację howManyGeese() , a następnie how_many_geese() można wywołać z Fortran.

Struktury C w Fortranie

Atrybut bind można również zastosować do typów pochodnych:

gęsi. h

struct Goose {
   int flock;
   float buoyancy;
}

struct Goose goose_c;

gęsi.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

Dane można teraz przesyłać między goose_c i goose_f . Procedury C, które pobierają argumenty typu Goose można wywoływać z Fortran z type(goose_t) .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow