Терминология компилятора Fortran: фиктивные переменные и атрибуты
может кто-нибудь объяснить мне, какой абстракции в парсере / компиляторе соответствует фиктивная переменная или атрибут?
PURE SUBROUTINE F(X, Y)
IMPLICIT NONE
REAL, INTENT(INOUT) :: X, Y, C
C REAL :: A, B
C REAL, SAVE :: C = 3.14E0
PARAMETER (C = 3.14E0, X = 32, Y = X)
X = Y + 2 * SIN(Y)
END
cetin@unique:~/lab/secret/tapenade$ gfortran -x f77 -c 1.f
1.f:6.37:
PARAMETER (C = 3.14E0, X = 32, Y = X)
1
Error: PARAMETER attribute conflicts with DUMMY attribute in 'x' at (1)
1.f:3.38:
REAL, INTENT(INOUT) :: X, Y, C
1
Error: Symbol at (1) is not a DUMMY variable
cetin@unique:~/lab/secret/tapenade$ ifort -c 1.f
1.f(3): error #6451: A dummy argument name is required in this context. [C]
REAL, INTENT(INOUT) :: X, Y, C
-------------------------------------^
1.f(6): error #6406: Conflicting attributes or multiple declaration of name. [X]
PARAMETER (C = 3.14E0, X = 32, Y = X)
-------------------------------^
1.f(6): error #6406: Conflicting attributes or multiple declaration of name. [Y]
PARAMETER (C = 3.14E0, X = 32, Y = X)
---------------------------------------^
1.f(6): error #6592: This symbol must be a defined parameter, an enumerator, or an argument of an inquiry function that evaluates to a compile-time constant. [X]
PARAMETER (C = 3.14E0, X = 32, Y = X)
-------------------------------------------^
compilation aborted for 1.f (code 1)
2 ответов
Fortran проходит по ссылке. Фиктивный атрибут соответствует тем переменным, которые передаются в функцию (X
и Y
в вашем случае). Оператор parameter ожидает чего-то статического, но так как X
- это все, что передается в функцию, это действительно не имеет никакого смысла. Оператор parameter-это способ настройки констант - он не имеет ничего общего с параметрами подпрограммы.
когда вы получаете ошибку, говоря, что C
- это не DUMMY
переменная, то это означает, что она не находит C
в списке переменных, которые будут переданы в / из функции-ваше объявление только F(X, Y)
: нет C
в поле зрения. Хотя, что вы не используете
фактическая проблема с вызовом хорошо объяснена Тимом Уиткомбом. Я постараюсь объяснить эти термины более подробно.
фиктивный аргумент является конкретным термином Fortran. Это то, что другие языки называют формальных параметров или аналогичного, т. е. это объект, который называется X
и Y
(в вашем случае) и ведьма ассоциируется с фактический аргумент при вызове процедуры.
subroutine s(i)
integer :: i
end
call s(1)
the i
является фиктивным аргументом подпрограммы s
в то время как выражение 1
является фактическим аргументом, который передается подпрограмме в фиктивный аргумент i
.
атрибуты являются формой указания дополнительных свойств объектов данных или процедур. Атрибуты можно указать с помощью операторов:
real c
intent(in) c
optional c
или их можно определить в одиночном объявление:
real, intent(in), optional :: c
таким образом, фиктивный аргумент c
по умолчанию с атрибутами intent(in)
и optional
.
противоречивые атрибуты атрибуты, которые не могут быть указаны для одного объекта одновременно. Ваш пример с intent(...)
и parameter
хорошо служит. Они несовместимы, поскольку первый подразумевает фиктивный аргумент, а другой указывает по имени константа.