Spec-Zone.ru › GNU Fortran 14

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

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

Аргументы передаются в соответствии с ABI платформы. В частности, сложные аргументы могут несовместимы со структурой с двумя реальными компонентами для вещественной и мнимой части. Передача аргументов соответствует _Complex) C99. Функции со скалярными комплексными переменными результата возвращают их значение и не используют аргумент по ссылке. Обратите внимание, что с опцией -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 длина символьной строки передаётся в качестве скрытого аргумента в конце списка аргументов, за исключением случаев, когда соответствующий фиктивный аргумент объявлен как TYPE(*). Для строк с отложенной длиной значение передаётся по ссылке, в противном случае — по значению. Длина символьной строки имеет тип 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, за исключением скалярных фиктивных аргументов внутреннего типа, имеющих атрибут VALUE. Для них используется скрытый булевый аргумент (logical(kind=C_bool),value) для указания наличия аргумента.

Аргументы, которые являются массивами с формой по умолчанию, рангом по умолчанию или рангом по умолчанию, или, с помощью -fcoarray=lib, аллокабельными скалярными комассивами, используют дескриптор массива. Все остальные массивы передают адрес первого элемента массива. С -fcoarray=lib токен и смещение, относящиеся к фиктивным аргументам неаллокабельных комассивов, передаются как скрытые аргументы наряду со скрытыми аргументами длины символьной строки. Токен — это непрозрачный указатель, идентифицирующий комассив, а смещение — передаваемое по значению целое число типа 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-14.2.0/gfortran/Argument-passing-conventions.html

Spec-Zone.ru

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