Терминология компилятора 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 хорошо служит. Они несовместимы, поскольку первый подразумевает фиктивный аргумент, а другой указывает по имени константа.