Псевдоним в функции Фортрана - PullRequest
2 голосов
/ 09 декабря 2011

По причинам оптимизации Fortran обеспечивает, чтобы фиктивные аргументы подпрограммы или функции не являлись псевдонимами, т. Е. Они не указывали на одно и то же место в памяти.возвращаемое значение функции.Другими словами, для данной функции myfunc:

function myfunc(a)
    real, intent(in) :: a(:)
    real             :: myfunc(size(a))
    myfunc = a * 2
end function myfunc

соответствует ли это стандартному написанию: a = myfunc (a) и b = myfunc (a)?

Ответы [ 2 ]

3 голосов
/ 09 декабря 2011

Аргументы функции и возвращаемого значения функции - это разные вещи.Вопреки предыдущему ответу, функциональные аргументы передаются по ссылке или при копировании, если они не объявлены как фиктивные аргументы с атрибутом VALUE.В этом основное отличие Fortran от C.

Однако, если значение функции создается с помощью обычного присваивания (=), а не присваивания указателя (=>), они являются отдельными сущностями.В вашем коде значение myfunc получается путем копирования значения a.Поэтому никакие стандартные правила не нарушаются a = myfunc(a) или b = myfunc(a).

0 голосов
/ 09 декабря 2011

Поскольку переменная a в myfunc является отдельной сущностью от a, который передается в качестве фиктивного аргумента от родительской подпрограммы, это прекрасно:

a = myfunc(a)

или

a = SQRT(a)

Здесь нет конфликта, потому что значение a копируется в фиктивный аргумент внутри функции, функция оценивается, и, в конце концов, значение функции копируется в.

Из Fortran 2008 Стандартный черновик:

12.5.3 Ссылка на функцию

1 Функция вызывается во время вычисления выражения с помощью ссылки на функцию или определенной операции (7.1.6),Когда он вызывается, все действительные выражения аргумента оцениваются, затем аргументы связываются, и затем выполняется функция.Когда выполнение функции завершено, значение результата функции становится доступным для использования в выражении, вызвавшем вызов функции.Характеристики результата функции (12.3.3) определяются интерфейсом функции.Если ссылка на элементарную функцию (12.8) является элементарной ссылкой, все аргументы массива должны иметь одинаковую форму.

Как правило, рекомендуется заставить функции не иметь побочных эффектов,Например, используйте атрибут PURE и объявите INTENT для всех фиктивных аргументов.

...