Fortran
C совместимость
Поиск…
Вызов C из Фортрана
В Fortran 2003 были введены языковые функции, которые могут гарантировать совместимость между C и Fortran (и до большего количества языков с использованием C в качестве посредника). Эти функции в основном доступны через встроенный модуль iso_c_binding
:
use, intrinsic :: iso_c_binding
intrinsic
ключевое слово здесь обеспечивает правильный модуль, а не созданный пользователем модуль с тем же именем.
iso_c_binding
дает доступ к параметрам типа совместимого типа:
integer(c_int) :: foo ! equivalent of 'int foo' in C
real(c_float) :: bar ! equivalent of 'float bar' in C
Использование параметров типа типа C гарантирует, что данные могут быть переданы между программами C и Fortran.
Взаимодействие символов C char и Fortran, вероятно, является темой для себя и поэтому не обсуждается здесь
Чтобы на самом деле вызвать функцию C из Fortran, сначала должен быть объявлен интерфейс. Это по существу эквивалентно прототипу функции C и позволяет компилятору узнать о количестве и типе аргументов и т. Д. Атрибут bind
используется, чтобы сообщить компилятору имя функции в C, которое может отличаться от Fortran название.
geese.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
Программа Fortran должна быть связана с библиотекой C (здесь зависит от компилятора? ), howManyGeese()
включает реализацию howManyGeese()
, а затем how_many_geese()
можно вызвать из Fortran.
Структуры C в Фортране
Атрибут bind
также может применяться к производным типам:
geese.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
Теперь данные могут передаваться между goose_c
и goose_f
. C-процедуры, которые принимают аргументы типа Goose
могут быть вызваны из Fortran с type(goose_t)
.