2009-06-28 73 views
6

ダミーの変数または属性がパーサー/コンパイラの抽象化のどのようなものであるかを誰かに説明することはできますか? Fortranコンパイラの用語:ダミーの変数と属性


[email protected]:~/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 

 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 

[email protected]:~/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) 

答えて

9

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

あなたはCDUMMY変数ではないというエラーを取得すると、その後、それは、関数の外に/に渡される変数のリストにCを見つけていないことを意味 - あなたの宣言は唯一F(X, Y)です:いいえCが見えます。 DUMMY属性を明示的に使用していませんが、INTENT(INOUT)属性があります。これは、これらの変数がサブルーチンの入出力に対応することを意味します。 - あなたはpureサブルーチンを宣言している、ことを意味する

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 

私はあなたがやろうとしているか全くわからない:

あなたは、あなたがのようになりますサブルーチンを持っているでしょう欲しいものを得るために、副作用のないサブルーチンですが、変数に intent(inout)を使用しています。つまり、実行中に XYを変更することができます。

は私が REAL :: C = 3.14E0のようなその宣言文で変数を初期化し、サブルーチン内だけでなく、その追加したい

暗黙のsave属性を持つ変数を生成します。ただし、コールからコールに保存する場合は、明示的に「save」属性を追加して正しいことを実行していることを確認してください。

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

3

実際の問題の呼び出しは、Tim Whitcombによってよく説明されています。私はこれらの用語をより明示的に説明しようとします。

ダミー引数は、Fortran固有の用語です。他の言語でという仮パラメータをなどと呼んでいます。すなわち、XY(あなたのケースでは)と呼ばれるオブジェクトで、手続きが呼び出されるとという実際の引数に関連付けられます。内したがって

:式1ダミー引数iにサブルーチンに渡される実引数である

subroutine s(i) 
    integer :: i 
end 

call s(1) 

iサブルーチンsの仮引数です。

アトリビュートは、データオブジェクトまたはプロシージャの追加プロパティを指定する形式です。属性はステートメントを使用して指定することができます。

real c 
intent(in) c 
optional c 

たり1つの宣言で指定することができます。

real, intent(in), optional :: c 

この方法で仮引数cは、属性intent(in)optionalと、デフォルトの実数です。

矛盾する属性は、同時に1つのオブジェクトに対して指定できない属性です。あなたの例はintent(...)parameterです。最初は仮引数を意味し、もう1つはという名前のを指定するため、これらは互換性がありません。

関連する問題