6.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, длина строки передаётся как скрытый аргумент в конце списка аргументов, за исключением случая, когда соответствующий фиктивный аргумент объявлен как 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-13.3.0/gfortran/Argument-passing-conventions.html