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