Spec-Zone.ru › GNU Fortran 5

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-5.4.0/gfortran/Argument-passing-conventions.html

Spec-Zone.ru

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