6

入力として 2 つの配列を受け入れるサブルーチンがあるとします。1 つはインテント (イン) が与えられ、もう 1 つはインテント (アウト) が与えられます。後者は、任意の方法で前者から導出されます。しかし、両方の仮引数に同じ実引数を渡すとどうなるでしょうか? 一般に、結果はサブルーチンによって意図されたものではありません。以下のコード スニペットを参照してください。

問題は、インテント フラグを指定したにもかかわらず、コンパイラが気にしていないように見えることです。Intel Visual Fortran Composer 12 をすべての診断機能とともに使用しています。コードをより安全にするために、サブルーチンをコーディングするより良い方法、または欠落しているコンパイラ オプションはありますか?

module foo

    contains

    subroutine sub_a()
        implicit none
        real::array(10,10)

        call sub_b(array,array)

    end subroutine

    subroutine sub_b(array1,array2)
        implicit none
        real,intent(in)::array1(10,10)
        real,intent(out)::array2(10,10)

        !array2 is derived from array1 somehow

    end subroutine

end module foo
4

2 に答える 2

8

これはエイリアシングと呼ばれ、同じアイテムを 2 つの異なる名前で参照します。ほとんどの場合、これは Fortran では許可されていません。あなたの例は合法的なFortranではありません - http://software.intel.com/en-us/blogs/2009/07/10/doctor-fortran-in-ive-come-here-for-an-argument-sideを参照してください-2/には、2 つの仮引数に使用される同じ実引数を介したエイリアシングのこの特定のケースがあります。Fortran コンパイラは、言語の規則違反をすべて診断する必要はありません。これは、コンパイラが認識していない例のようです。

編集:エイリアシングは許可されています。禁止されているのは、エイリアスを介して仮引数の値を変更することです。ここでは、他の仮引数です。規則は、ポインターおよびターゲット引数に対する制限が緩和されています。具体的な規則については、Adams らによる「The Fortran 2003 Handbook」で説明されています。

于 2011-08-22T02:00:23.883 に答える