web-dev-qa-db-ja.com

Fortranの意図(inout)と省略の意図

Fortranのサブルーチン引数には、それぞれ指定された意図(つまりintent(in)intent(out)またはintent(inout)が記載されているように指定する必要があります)が適切に設定されています この質問 ):

_subroutine bar (a, b)
    real, intent(in) :: a
    real, intent(inout) :: b
    b = b + a
    ...
_

ただし、インテントを指定しないことは有効なFortranです。

_subroutine bar (a, b)
    real, intent(in) :: a
    real :: b
    b = b + a
    ...
_

intent(inout)として指定された引数と、指定された意図のない引数のコンパイル時チェック以外に、実際の違いはありますか?古いインテントフリーのコードにインテントを改造する場合に心配すべきことはありますか?

34
Andrew Walker

AdamsなどによるThe Fortran 2003 Handbookによると、intent(inout)引数と指定されていない引数の間に1つの違いがあります。 intent(inout)の場合の実際の引数(つまり、呼び出し元)は常に定義可能でなければなりません。インテントが指定されていない場合、引数は定義可能でなければなりませんifサブルーチンの実行は、ダミー引数を定義しようとします。 definableは、値の設定を意味します:dummy_arg = 2.0。これが行われる場合、実際の引数は変数でなければなりません。 intent(inout)の場合、サブルーチンがこれを行うかどうかにかかわらず、実際の引数は定義可能でなければなりません。意図が指定されていない場合、それはサブルーチンのその特定の呼び出しで何が起こるかに依存します-サブルーチンが変数を定義しない場合、それはOKです。もしそうなら、問題があるよりも-定数である実際の引数に書き込むような場合は明らかに問題を引き起こします。

これは、コンパイラーがこれらのすべてのケースを診断することを意味するものではありません。標準がコンパイラーに診断を要求するのは別の問題です。違反はコードの実行時のフローに依存するため、コンパイル時にインテントが指定されていないケース要件のすべてのエラーを検出することはほぼ不可能です。コンパイラーが意図(inout)のケースを診断し、コードの問題を警告する方がはるかに簡単です。

23
M. S. B.

あなたの質問は、コードが実際の引数としてPARAMETERを渡し、サブプログラムが次に書き込もうとする場合に、動作の違いが発生する可能性があるのか​​どうか(今すぐやるべきこと)を尋ねるプロンプトを表示します。 INTENT宣言がないと、コンパイラーはこれを許可せず、奇妙な動作を引き起こす可能性があります。宣言があると、コンパイル時エラーが発生します。

あなたと私は、INOUT宣言とINTENT宣言の間に違いはないと思うかもしれませんが、古いFortranプログラムがたくさんあり、古い言語バージョンとの互換性が新しい標準の重要な機能であることを忘れないでください。それが正しかった(しかし危険な)FORTRAN77なら、多くの人々は、Fortran 90+コンパイラでコードが正しいまま(まだ危険なまま)であることを期待しています。

2003年標準を簡単に読むと、INOUTとINTENTなしの間に違いがあることを示していますが、より綿密な読み取りが必要です。これをテストする場合は、結論をお知らせください。後で時間があれば、自分でテストしてお知らせします。

インテントイン/インの役割を理解するには、Fortran 実質的にが内部的に変数を参照渡しすることを知っておく必要があります。これは、実際に参照渡しすることと常に同じとは限りません。

2次元配列の内部サブセクションをサブルーチンに渡す場合、つまりdata(i1:i2, j1:j2)の場合、Fortranはそのデータをメモリの隣接するセクションにコピーし、新しいアドレスをルーチンに渡します。戻ると、データは元の場所にコピーされます。

INTENTを指定することにより、コンパイラはコピー操作の1つをスキップすることを知ることができます。

変更しないデータを変更するためのフェイルセーフとして機能するだけでなく、大きなデータセットを処理するときにコードを高速化することもできます。

3
Vladimyr