Фортран проходит по ссылке. Атрибут dummy соответствует тем переменным, которые передаются в функцию (X
и Y
в вашем случае). Оператор параметра ожидает чего-то статического, но поскольку X
- это то, что передается в функцию, это действительно не имеет никакого смысла. Оператор параметров - это способ установки констант - он не имеет ничего общего с параметрами подпрограммы.
Когда вы получаете сообщение о том, что C
не является переменной DUMMY
, это означает, что он не находит C
в списке переменных, которые будут переданы в / из функции - ваше объявление только F(X, Y)
: нет C
в поле зрения. Хотя вы явно не используете атрибут DUMMY
, у вас есть атрибут INTENT(INOUT)
, что означает, что эти переменные соответствуют подпрограмме ввода / вывода.
Чтобы получить то, что вы хотите, у вас есть подпрограмма, которая выглядит примерно так:
subroutine F(X, Y)
implicit none
! These are the dummy variables
real, intent(inout) :: X, Y
! These are the variables in the scope of this subroutine
real :: a, b
real, parameter, save :: c = 3.14E0
X = Y + 2*sin(Y)
end subroutine F
Я не совсем уверен, что вы пытаетесь сделать - вы объявляете подпрограмму pure
, что означает подпрограмму без побочных эффектов, но вы используете intent(inout)
для своих переменных, что означает, что X
и Y
могут быть изменены в процессе исполнения.
Я бы добавил также, что внутри подпрограммы инициализация переменной в ее операторе объявления, например REAL :: C = 3.14E0
, дает переменную с неявным save
атрибутом. Однако, если вы хотите, чтобы он был сохранен от звонка к звонку, вы поступили правильно, явно добавив атрибут save
, чтобы было ясно, что вы это делаете.
Я не разбираюсь в парсере / компиляторе, но я думаю, что для ответа на ваш вопрос атрибут dummy
означает, что вы просто получаете указатель - вам не нужно выделять пробел, так как переменная в вызове функции уже выделено место.