Fortran 77 コードでは、共通ブロックと等価ステートメントの組み合わせ使用があります。例えば、
common /X/ a,b,c,d
dimension arr(4)
equivalent(arr(1),a)
この種の Fortran 77 コードを Fortran 90 コードに変換する実行可能なソリューションを提供できる人はいますか?
Fortran 77 コードでは、共通ブロックと等価ステートメントの組み合わせ使用があります。例えば、
common /X/ a,b,c,d
dimension arr(4)
equivalent(arr(1),a)
この種の Fortran 77 コードを Fortran 90 コードに変換する実行可能なソリューションを提供できる人はいますか?
私はあなたがequivalence
声明を意味すると仮定します。これにより、名前付き変数がストレージを共有します。
簡単ではないかもしれません。変数の使用方法に応じて、いくつかの可能なアプローチがあります。
等価ステートメントを使用すると、さまざまな変数が同じストレージを占有するため、対応する変数が変更されると自動的に更新されます。b
変更されるたびにa(2)
自動的に変更されるなど 変更されるたびa(3)
にc
自動的に変更されるなど
すべての変数をモジュール変数にすることができます。グローバル変数を持つ Fortran 90 の方法です。同等のステートメントを省略すると、ストレージを共有しなくなります。次に、への変更後、 へのa(2) = b
変更後などと単純に書くことができます。しかし、これには、これらの変数のいずれかが変更されたプログラム内のすべての場所を特定し、プログラムが変更されたときにこのメソッドに従い続ける必要があります。これは簡単ではないかもしれません。
などの記述は、変数が同じ型であることを前提としています。そうでない場合、Fortran 90 に相当するのは組み込み関数です。b
b = a(2)
a(2)
a(2) = b
equivalence
transfer
コードが変数で何をしているかに応じて、2 つのより良い解決策があります。プログラムが実際に等価ステートメントを使用して情報を転送している場合は、変数名のセットを 1 つだけ使用するようにコードを書き直すことができるかどうかを確認してください。他の名前が使用されている場合は、それを置き換えます。これは、タイプが同じ場合にのみ可能です。
プログラムが等価性を使用して、メモリを節約するために同時に使用されない変数をオーバーレイしている場合は、より簡単です。この場合、等価ステートメントを削除して、変数を共通ではなくモジュール変数にすることができ、追加の作業は必要ありません。そしておそらく、それらはもはやグローバル変数である必要はありません。あるサブルーチンが別のセットを使用し、別のサブルーチンが別のセットを使用していて、共通および等価性がストレージを節約する方法にすぎない場合、それらをローカル変数にすることができます。
最善の解決策は、特定のプログラムを理解することに依存します。
私はequivalence
有害だと考えています...取り除くのにかなりの努力をする価値があります。それでも、大規模なプログラムに深く組み込まれすぎると、非常に困難になる可能性があります。