Fortran
Współdziałanie C.
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)
.