Spec-Zone.ru › GNU Fortran 8

7.4.2 Конвенции передачи аргументов

Подпрограммы не возвращают значение (соответствующее C99’s void), в то время как функции либо возвращают значение, как указано в платформенном ABI, либо переменная результата передается как скрытый аргумент функции, и результат не возвращается. Скрытая переменная результата используется, когда переменная результата является массивом или типа CHARACTER.

Аргументы передаются в соответствии с платформенным ABI. В частности, сложные аргументы могут быть несовместимы со структурой с двумя действительными компонентами для действительной и мнимой части. Передача аргументов соответствует той, что используется в C99’s _Complex. Функции со скалярными комплексными переменными результата возвращают их значение и не используют аргумент по ссылке. Обратите внимание, что с опцией -ff2c передача аргументов изменяется и больше не полностью соответствует платформенному ABI. Некоторые другие компиляторы Fortran используют f2c семантику по умолчанию; это может вызвать проблемы с взаимодействием.

GNU Fortran передает большинство аргументов по ссылке, т. е. передавая указатель на данные. Обратите внимание, что компилятор может использовать временную переменную, в которую скопирован фактический аргумент, если это требуется семантически (копирование в/копирование из).

Для аргументов с ALLOCATABLE и POINTER атрибутом (включая указатели на процедуры) передается указатель на указатель, так что адрес указателя может быть изменен в процедуре.

Для фиктивных аргументов с атрибутом VALUE: Скалярные аргументы типа INTEGER, LOGICAL, REAL и COMPLEX передаются по значению в соответствии с платформенным ABI. (Как расширение поставщика и не рекомендуется, использование %VAL() в вызове процедуры имеет тот же эффект.) Для TYPE(C_PTR) и указателей на процедуры передается сам указатель, так что он может быть изменен без влияния на вызывающую сторону.

Для логических (LOGICAL) аргументов обратите внимание, что GCC ожидает только целые значения 0 и 1. Если переменная GNU Fortran LOGICAL содержит другое целое значение, результат неопределен. Поскольку некоторые другие компиляторы Fortran используют -1 для .TRUE., необходимо проявлять особую осторожность — например, передавая значение как INTEGER. (Такое же ограничение по значениям также относится к другим фронтендам GCC, например, к компилятору C99 GCC для _Bool или компилятору Ada GCC для Boolean).

Для аргументов типа CHARACTER длина символьной строки передается как скрытый аргумент в конце списка аргументов. Для строк с отложенной длиной значение передается по ссылке, в противном случае — по значению. Длина символьной строки имеет тип C size_t (или INTEGER(kind=C_SIZE_T) в Fortran). Обратите внимание, что это отличается от более ранних версий компилятора GNU Fortran, где тип скрытого аргумента длины символьной строки был C int. Для сохранения совместимости со старыми версиями можно, например, для следующей Fortran-процедуры

subroutine fstrlen (s, a)
   character(len=*) :: s
   integer :: a
   print*, len(s)
end subroutine fstrlen

определить соответствующий прототип C следующим образом:

#if __GNUC__ > 7
typedef size_t fortran_charlen_t;
#else
typedef int fortran_charlen_t;
#endif

void fstrlen_ (char*, int*, fortran_charlen_t);

Чтобы избежать таких зависимостей от компилятора, для нового кода рекомендуется использовать функцию ISO_C_BINDING.

Обратите внимание, что с привязкой C, CHARACTER(len=1) переменные результата возвращаются в соответствии с платформенным ABI, и для фиктивных аргументов не используется скрытый аргумент длины; с VALUE, эти переменные передаются по значению.

Для фиктивных аргументов типа OPTIONAL отсутствующий аргумент обозначается указателем NULL, за исключением скалярных фиктивных аргументов типа INTEGER, LOGICAL, REAL и COMPLEX, имеющих атрибут VALUE. Для них используется скрытый логический аргумент (logical(kind=C_bool),value) для указания наличия аргумента.

Аргументы, которые являются массивами с формой, рангом или рангом отложенной формы, или, с -fcoarray=lib, скалярные комассивы с возможностью выделения памяти, используют описатель массива. Все остальные массивы передают адрес первого элемента массива. С -fcoarray=lib токен и смещение, относящиеся к фиктивным аргументам невыделяемых комассивов, передаются как скрытые аргументы вместе со скрытыми аргументами длины символьной строки. Токен — это opaque указатель, идентифицирующий комассив, а смещение — передаваемое по значению целое число вида C_PTRDIFF_T, обозначающее смещение байтов между базовым адресом комассива и переданным скаляром или первым элементом переданного массива.

Аргументы передаются в следующем порядке:

  • Переменная результата, когда результат функции передается по ссылке
  • Длина символьной строки результата функции, если она является типа CHARACTER и не используется привязка C
  • Аргументы в порядке их появления в объявлении Fortran
  • Состояние присутствия для необязательных аргументов с атрибутом значения, которые передаются по значению внутри
  • Длина символьной строки и/или токен и смещение комассива для первого аргумента, который является CHARACTER или фиктивным аргументом невыделяемого комассива, за которым следуют скрытые аргументы следующего фиктивного аргумента такого типа

Предыдущий: Конвенции именования, Вернуться к: Конвенции именования и передачи аргументов [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.4.0/gfortran/Argument-passing-conventions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API