Дата публикации: Dec 07, 2012 11:56:22 AM
Исходящие и входяще-исходящие аргументы - традиционная черта Фортрана. Иногда это раздражает, когда код чужой и назнгачение не указано явно - где, черт возьми, определяется этот объект? Если Y = F(X), то все понятно, и есть гарантия, что Y не меняется вплоть до этой строчки. А если F(X,Y) меняет Y - то гарантий никаких нет и надо хорошо понимать структуру программы. А если, еще хуже, Y глобально (COMMON или в модуле), то даже просто call F может менять Y. Иногда это полезно, и очень, когда надо возвратить более одного значения, да притом массивных, и разных конфигураций и типов. Тогда удобно: call F(x,y,z) - x входящий, y и z исходящие. Поэтому в Фортране довольно часто используются подпрограммы вместо функций. Например, random_number(harvest) возвращает случайное число в исходящем аргументе.
Есть возможность регламентировать назначение параметров. INTENT(IN) - это входящий параметр, он не может быть изменен в процедуре, фактическим аргументом может быть константа. INTENT(OUT) - это исходящий параметр, он определяется в процедуре, значение фактического аргумента не имеет значения и к нему нет доступа. INTENT(INOUT) - параметр смешанного назначения, его значение может быть использовано и переопределено. VALUE - атрибут параметра, передаваемого по значению. Передается копия фактического аргумента, поэтому присваивать аргументу в теле процедуры можно, но на фактическом аргументе это не скажется. Бывает удобно, но вообще атрибут введен для взаимодействия с языком C.
Стерильная функция может иметь только входящие аргументы. Стерильная подпрограмма может иметь исходящие (или смешанные) аргументы, но атрибут назначения должен быть явно указан в любом случае. Таким образом, стерильная подпрорамма все же может менять кое-что вне своего тела - через исходящие аргументы, если так задумано. А функция - не может, она может только вернуть значение.
Аргументы определяются либо своим порядком, либо - и это не во всех языках есть - именами формальных параметров. Например, можно определить функцию так: function f(x,y) и потом вызвать ее: f(1,2). А можно вызвать так: f(y=9,x=4). поэтому имеют большое значение имена формальных параметров, особенно для встроенных или чужих процедур.
Аргументы могут быть необязательные - с атрибутом optional. Если такой аргумент не последний, то ключевой способ задания аргументов становится необходимостью. Функция present позволяет выяснить, задан ли аргумент. Неопределенный указатель кв качестве необязательного аргумента считается отсутствующим.