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, длина строки передаётся в качестве скрытого аргумента. Для строк с отложенной длиной значение передаётся по ссылке, в противном случае — по значению. Длина символа имеет тип INTEGER(kind=4). Обратите внимание, что при связывании с 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-4.9.3/gfortran/Argument-passing-conventions.html