7.1.6 Дальнейшая взаимосвязь Fortran с C
Техническое описание ISO/IEC TS 29113:2012 по дальнейшей взаимосвязи Fortran с C расширяет поддержку взаимосвязи Fortran 2003 и Fortran 2008. Помимо устранения некоторых ограничений, оно добавляет переменные с предполагаемым типом (TYPE(*)) и предполагаемым рангом (dimension) и позволяет использовать массивы с предполагаемой формой, предполагаемым рангом и отложенной формой, включая allocatables и указатели.
Примечание: В настоящее время 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в скаляры или массивы определенного ранга. Ранг можно определить с помощью встроенной функцииRANK.
В настоящее время не реализовано:
- GNU Fortran всегда использует описатель массива, который не соответствует описателю из технического описания. Заголовочный файл
ISO_Fortran_binding.hи указанные в нем функции C недоступны. - Использование массивов с предполагаемой формой, предполагаемым рангом и отложенной формой в
BIND(C)процедурах не полностью поддерживается. В частности, строки C, совместимые с Fortran, длиной, отличной от единицы, не поддерживаются, так как это требует нового описателя массива.
Предыдущая: Работа с указателями, Вверх: Взаимосвязь с C [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.4.0/gfortran/Further-Interoperability-of-Fortran-with-C.html