8

ダミー変数または属性が対応するパーサー/コンパイラーの抽象化の種類を誰かに説明してもらえますか?

      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)
4

2 に答える 2

10

Fortran は参照渡しです。ダミー属性は、関数に渡される変数に対応します (XあなたYの場合は)。パラメーター ステートメントは静的なものを期待していますがX、関数に渡されるものは何でもであるため、実際には意味がありません。パラメータ ステートメントは、定数を設定する方法です。サブルーチンのパラメータとは関係ありません。

Cそれが変数ではないというエラーが表示された場合、それは、関数に渡される/関数から渡される変数のリストにDUMMY見つからないことを意味します-あなたの宣言は、見えないだけです. 属性を明示的に使用していませんが、属性を持っています。つまり、これらの変数はサブルーチンの入出力に対応しています。CF(X, Y)CDUMMYINTENT(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を持つ変数が生成されるように追加することもできます。ただし、呼び出しごとに保存したい場合は、属性を明示的に追加して、それが何をしているのかを明確にすることで正しいことを行いました. savesave

私はパーサー/コンパイラーの人ではありませんが、あなたの質問に答えるために、dummy属性はポインターを取得しているだけであることを意味すると思います-関数呼び出しで使用される変数は既に使用されているため、スペースを割り当てる必要はありませんスペースが割り当てられています。

于 2009-06-28T16:46:39.840 に答える