Buscar..


Llamando C desde Fortran

Fortran 2003 introdujo características de lenguaje que pueden garantizar la interoperabilidad entre C y Fortran (y para más idiomas utilizando C como intermediario). A estas funciones se accede principalmente a través del módulo intrínseco iso_c_binding :

use, intrinsic :: iso_c_binding

La palabra clave intrinsic aquí garantiza que se use el módulo correcto, y no un módulo creado por el usuario con el mismo nombre.

iso_c_binding da acceso a parámetros de tipo de tipo interoperables :

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

El uso de parámetros de tipo C garantiza que los datos pueden transferirse entre los programas C y Fortran.

La interoperabilidad de los caracteres C char y Fortran es probablemente un tema por sí mismo y, por lo tanto, no se trata aquí.


Para llamar realmente a una función C desde Fortran, primero se debe declarar la interfaz. Esto es esencialmente equivalente al prototipo de la función C, y le permite al compilador conocer el número y el tipo de los argumentos, etc. El atributo de bind se usa para decirle al compilador el nombre de la función en C, que puede ser diferente al de Fortran. nombre.

gansos.h

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

gansos 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

El programa de Fortran debe estar vinculada con la librería C (compilador dependiente, se incluyen aquí?), Que incluye la implementación de howManyGeese() , y luego how_many_geese() puede ser llamado desde Fortran.

C structs en fortran

El bind atributo también se puede aplicar a tipos derivados:

gansos.h

struct Goose {
   int flock;
   float buoyancy;
}

struct Goose goose_c;

gansos 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

Los datos ahora se pueden transferir entre goose_c y goose_f . Las rutinas C que toman argumentos de tipo Goose se pueden llamar desde Fortran con type(goose_t) .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow