7.4.2 Конвенции передачи аргументов
Подпрограммы не возвращают значение (соответствует C99’s void), в то время как функции либо возвращают значение, как указано в ABI платформы, либо переменная результата передаётся как скрытый аргумент функции, и результат не возвращается. Скрытая переменная результата используется, когда переменная результата является массивом или имеет тип CHARACTER.
Аргументы передаются в соответствии с ABI платформы. В частности, сложные аргументы могут быть несовместимы со структурой с двумя реальными компонентами для действительной и мнимой части. Передача аргументов соответствует C99’s _Complex. Функции со скалярными комплексными переменными результата возвращают своё значение и не используют аргумент по ссылке. Обратите внимание, что с опцией -ff2c передача аргументов модифицируется и больше не полностью соответствует ABI платформы. Некоторые другие компиляторы Fortran используют f2c семантику по умолчанию; это может привести к проблемам с межпрограммной совместимостью.
GNU Fortran передаёт большинство аргументов по ссылке, т.е. путём передачи указателя на данные. Обратите внимание, что компилятор может использовать временную переменную, в которую скопирован фактический аргумент, если это семантически необходимо (copy-in/copy-out).
Для аргументов с 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 токен и смещение, относящиеся к неаллоцируемым комассивам фиктивных аргументов, передаются как скрытые аргументы вместе со скрытыми аргументами длины символов. Токен — это непрозрачный указатель, идентифицирующий комассив, а смещение — целое число по значению, передаваемое как целое число вида 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-9.3.0/gfortran/Argument-passing-conventions.html