Почему ISO_C_BINDING

Я работаю над некоторым кодом fortran-call-C и не понимаю, как использовать модуль iso_c_binding.

У меня интерфейсы fortran и C успешно работают без iso_c_binding, и вопрос в том, должен ли я по-прежнему явно связывать функции и переменные. Например, это работает:

program testprog
...
interface
  subroutine c_parser(param)
    integer, intent(in) :: param
  end subroutine
end interface

integer :: a
call c_parser(a)
..
end program

/****************/

void c_parser_ (int* param)

Итак, добавьте подчеркивание к функции C, напишите для нее интерфейс и вызовите ее из программы fortran. Я не использую указатели или размещаемые объекты, весь мой код имеет целые числа, символы с плавающей запятой, числа с плавающей запятой и логические значения, которые необходимо перенести из подпрограммы fortran в C.

Какой именно цели служит iso_c_binding? Есть ли ошибки? Например, this упоминает предостережение при использовании строк через привязку ( см. часть «К сожалению, по крайней мере, на компиляторах GNU и Intel заявление»).


person jitihsk    schedule 22.10.2013    source источник
comment
Вы читали главу 15 последнего стандарта? j3-fortran.org/doc/year/10/10- 007.pdf   -  person milancurcic    schedule 22.10.2013
comment
К сожалению, по крайней мере, в компиляторах GNU и Intel утверждение Вот как работает присвоение скаляров массивам, не более того.   -  person Vladimir F    schedule 23.10.2013


Ответы (2)


"Рабочий" подход в вопросе по своей сути зависит от процессора Fortran. Это обычное устройство в некоторых операционных системах из-за исторической договоренности, но отнюдь не повсеместно. В семействе компиляторов аспекты соглашения о вызовах будут меняться в зависимости от параметров компиляции и изменяться в зависимости от версии компилятора, что может нарушить этот подход.

ISO_C_BINDING - это просто модуль, который предоставляет некоторые константы, некоторые типы и некоторые процедуры. Это тот, который указан в стандарте и предоставляется поставщиком компилятора (это внутренний модуль), но в остальном он не имеет особых полномочий.

Все эти константы, типы и процедуры помогают программисту на Фортране создавать переносимые объекты данных, указатели данных и указатели процедур, совместимые с их аналогами на языке Си. Некоторые типы и процедуры являются особыми - программист не обязательно может создать их, написав свой собственный код на Фортране.

Функциональная совместимость с C - это гораздо больше, чем использование встроенного модуля. Размещение USE ISO_C_BINDING в верхней части области видимости само по себе ничего не меняет, кроме того, что делает определенные идентификаторы доступными.

Атрибут BIND (C) должен применяться к переменным, производным типам, общим блокам и процедурам, которые должны взаимодействовать между C и Fortran. В некоторых случаях этот атрибут также указывает имя привязки (имя C) для объекта. Для производных и общих типов это может изменить выравнивание и порядок компонентов, в то время как для процедур это может изменить аспекты соглашения о вызове процедуры.

Существует также набор требований к природе взаимодействующих объектов данных и процедур, которым должен следовать программист.

(Комментарий «К сожалению ...» на связанной вики-странице fortran кажется неправильным пониманием того, как присваивание массиву символов работает в Фортране - он не имеет ничего общего с функциональной совместимостью C как таковой, за исключением требования, что это LEN = 1 символьные массивы в Фортране, которые совместимы с массивами символов C.)

Если набор целевых компиляторов для конкретного проекта поддерживает необходимые части Fortran 2003, то я не могу придумать веских причин, чтобы не использовать функции совместимости C языка Fortran 2003. Улучшение надежности и переносимости результирующего кода, которое приводит к от использования этой функции убедительно.

person IanH    schedule 22.10.2013
comment
Мне было интересно, почему бы по умолчанию не использовать взаимодействующие типы C ++ для целых чисел и чисел с плавающей запятой? Я имею в виду, что есть целая проблема с точностью real и double precision по сравнению с real(dp), где dp = selected_real_type(N) или еще. Почему бы не использовать значение по умолчанию dp = c_double, за исключением особых случаев, когда заданная точность действительно имеет значение? (а затем применять последовательно для целых чисел ...). Поскольку в любом случае кажется необходимым писать подробный код ... Есть мнение? - person Mahé; 13.12.2015

ISO_C_Binding является частью стандарта языка и делает интерфейс между Fortran C стандартом и переносимым. Выяснить, как работает интерфейс между определенной парой компиляторов в конкретной ОС, непросто.

person M. S. B.    schedule 22.10.2013