Fortran
C interopérabilité
Recherche…
Appeler C depuis Fortran
Fortran 2003 a introduit des fonctionnalités de langage qui peuvent garantir l’interopérabilité entre C et Fortran (et vers davantage de langues en utilisant C comme intermédiaire). Ces fonctionnalités sont principalement accessibles via le module intrinsèque iso_c_binding
:
use, intrinsic :: iso_c_binding
Le mot-clé intrinsic
garantit que le bon module est utilisé, et non un module créé par l'utilisateur du même nom.
iso_c_binding
donne accès à des paramètres de type type interopérables :
integer(c_int) :: foo ! equivalent of 'int foo' in C
real(c_float) :: bar ! equivalent of 'float bar' in C
L'utilisation de paramètres de type C kind garantit que les données peuvent être transférées entre les programmes C et Fortran.
L'interopérabilité des caractères C char et Fortran est probablement un sujet pour lui-même et donc pas discuté ici
Pour appeler une fonction C à partir de Fortran, l'interface doit d'abord être déclarée. Ceci est essentiellement équivalent au prototype de la fonction C et permet au compilateur de connaître le nombre et le type des arguments, etc. L'attribut bind
est utilisé pour indiquer au compilateur le nom de la fonction dans C, qui peut être différente de celle du Fortran. prénom.
oies.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
Le programme Fortran doit être lié à la bibliothèque C ( dépend du compilateur, inclure ici? ) howManyGeese()
inclut l'implémentation de howManyGeese()
, puis how_many_geese()
peut être appelé à partir de Fortran.
C structs dans Fortran
L'attribut bind
peut également être appliqué aux types dérivés:
oies.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
Les données peuvent maintenant être transférées entre goose_c
et goose_f
. C routines qui prennent des arguments de type Goose
peuvent être appelées de Fortran avec le type(goose_t)
.