Fortran
Interoperabilidad C
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)
.