2011-12-08 12 views
2

最適化の理由から、Fortranでは、サブルーチンまたは関数の仮引数がエイリアスではなく、つまり同じメモリの場所を指していないことが強制されます。Fortran関数のエイリアシング

同じ制約が関数の戻り値に適用されるかどうかは疑問です。所与myfunc関数関数の言い換える :

function myfunc(a) 
    real, intent(in) :: a(:) 
    real    :: myfunc(size(a)) 
    myfunc = a * 2 
end function myfunc 

それが書き込みに標準に準拠している: = myfunc関数(A)と B = myfunc関数(A)?

答えて

3

関数と関数の戻り値の引数は異なるものです。前の答えとは逆に、関数引数は、VALUE属性を持つ仮引数として宣言されていない限り、参照渡し、またはコピーインのコピーアウトによって渡されます。これは、FortranとCの主な違いです。

しかし、関数の値がポインタ代入(=>)ではなく通常の代入(=)で構成されている場合、それらは別個のエンティティです。あなたのコードでは、myfuncの値はaの値をコピーすることによって得られます。したがって、標準ルールはa = myfunc(a)またはb = myfunc(a)で壊れません。

+0

良い答え。 +1 – milancurcic

0

てmyfuncで変数aが、親ルーチンからの仮引数として渡すされていることとは別のエンティティであるので、それを行うのは完全に罰金です:

a = myfunc(a) 

または

a = SQRT(a) 

ここでは、aの値が関数内の仮引数にコピーされているため、関数が評価されており、最後に関数の値がaにコピーされているため、競合はありません。

12.5.3ファンクション参照

1関数機能、参照により、または定義された操作(7.1.6)によって式の評価中に呼び出され:標準案はFortranの2008年

。 呼び出されると、すべての実際の引数式が評価され、 、次に引数が関連付けられてから関数が実行されます。 関数の実行が完了すると、関数 の結果が、関数 が呼び出される式で使用できるようになります。関数結果(12.3.3)の特性は、関数のインタフェースによって決定される です。 要素関数(12.8)への参照が要素参照である場合、すべての配列 の引数は同じ形になります。

一般に、機能に強制的に副作用がないようにすることをお勧めします。 PURE属性を使用し、すべての仮引数に対してINTENTを宣言します。

+1

あなたの答えの最初の文は、確かに真実ではありません。 –

+0

必要に応じて回答を編集したり、別の回答を追加してください。 – milancurcic

関連する問題