7.1.6 Дополнительная совместимость Fortran с C
Техническое описание ISO/IEC TS 29113:2012 по дополнительной совместимости Fortran с C расширяет поддержку совместимости Fortran 2003 и Fortran 2008. Помимо устранения некоторых ограничений, оно добавляет переменные с предположительным типом (TYPE(*)) и предположительным рангом (dimension) и позволяет обеспечить совместимость массивов с предположительной формой, предположительным рангом и отложенной формой, включая allocatable и указатели.
Примечание: В настоящее время GNU Fortran не использует внутренне описатель массива (вектор допов), как указано в техническом описании, а использует описатель массива с различными полями. Формальные аргументы предположительного типа и предположительного ранга преобразуются в библиотеке в указанную форму. Функции API ISO_Fortran_binding (также Fortran 2018 18.4) реализованы в libgfortran. В качестве альтернативы, инструменты Chasm Language Interoperability, 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-11.1.0/gfortran/Further-Interoperability-of-Fortran-with-C.html