7.1.6 Дальнейшая взаимосвязь Fortran с C
Техническое задание ISO/IEC TS 29113:2012 по дальнейшей взаимосвязи Fortran с C расширяет поддержку взаимосвязи Fortran 2003 и Fortran 2008. Помимо удаления некоторых ограничений, оно добавляет переменные с предполагаемым типом (TYPE(*)) и предполагаемым рангом (dimension) и позволяет использовать взаимосвязь массивов с предполагаемой формой, предполагаемым рангом и отложенной формой, включая allocable и указатели.
Примечание: В настоящее время GNU Fortran не использует внутренне описатель массива (вектор dope), как указано в техническом задании, а использует описатель массива с различными полями. Формальные аргументы с предполагаемым типом и предполагаемым рангом преобразуются в библиотеке в указанную форму. Функции API ISO_Fortran_binding (также Fortran 2018 18.4) реализованы в libgfortran. В качестве альтернативы, инструменты взаимосвязи языка Chasm, http://chasm-interop.sourceforge.net/, предоставляют интерфейс к описателю массива GNU Fortran.
Техническое задание добавляет следующие новые функции, которые поддерживаются GNU Fortran:
- Атрибут
ASYNCHRONOUSбыл уточнен и расширен, чтобы позволить его использование с асинхронной передачей данных в библиотеках пользователя, таких как реализации спецификации Message Passing Interface. - Многие ограничения были ослаблены, в частности для функций
C_LOCиC_F_POINTER. - Атрибут
OPTIONALтеперь разрешен для аргументов-фиктив; отсутствующий аргумент соответствует указателюNULL. - Были добавлены предполагаемые типы (
TYPE(*)), которые могут использоваться только для аргументов-фиктив. Они являются полиморфными, но, в отличие отCLASS(*), не содержат никакой информации о типе, аналогично указателямvoid *C. Можно передавать выражения любого типа и размера; таким образом, он может быть использован как замена дляTYPE(C_PTR), избегая использованияC_LOCв вызывающей программе.Однако следует отметить, что
TYPE(*)принимает только скалярные аргументы, если явно не указанDIMENSION. Так какDIMENSION(*)поддерживает только массивы (включая элементы массива), но не скаляры, это не полная замена дляC_LOC. С другой стороны, аргументы-фиктивные с предполагаемым типом и предполагаемым рангом (TYPE(*), DIMENSION(..)) позволяют передавать как скаляры, так и массивы, но требуют специального кода со стороны вызываемой функции для обработки описателя массива. - Массивы с предполагаемым рангом (
DIMENSION(..)) в качестве аргумента-фиктивного позволяют передавать скаляры и массивы любого ранга в качестве фактического аргумента. Поскольку техническое задание не предоставляет прямых средств работы с ними, их необходимо использовать либо со стороны C, либо преобразовать с помощьюC_LOCиC_F_POINTERв скаляры или массивы определенного ранга. Ранг можно определить с помощью функцииRANK.
В настоящее время не реализовано:
- GNU Fortran всегда использует описатель массива, который не соответствует описателю технического задания. Заголовочный файл
ISO_Fortran_binding.hи указанные в нем функции C недоступны. - Использование массивов с предполагаемой формой, предполагаемым рангом и отложенной формой в процедурах
BIND(C)не полностью поддерживается. В частности, не поддерживаются строки C с интерфейсом для передачи данных, длина которых отличается от единицы, так как это требует нового описателя массива.
Предыдущее: Работа с указателями, Вверх: Взаимодействие с C [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gfortran/Further-Interoperability-of-Fortran-with-C.html