Spec-Zone.ru › GNU Fortran 7

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

Spec-Zone.ru

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