Поиск…


Вызов 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) .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow