Поскольку переменная 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
для всех фиктивных аргументов.