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



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow