2012-04-05 10 views
0

このF77コードでは、COMMON BLOCKSを幅広く使用しています。これらのCOMMON BLOCKSは、Cプログラム(ネームマングリング後)でも使用されています。 foo(a、b、...)がFortranコードのメインルーチンである場合は、共通ブロックをfoo()にローカルにするために、次のようなことができますか?Fortran 77で共通ブロック変数の範囲をローカライズ

program new_control_routine() 

... 
call foo(a1,b1,...) 
... 
call foo(a2,b2,...) 
... 
end 

ポイントは、彼らそれらのブロックが同じ名前を持っているにもかかわらず、それらのそれぞれが独立した共通ブロックを持つ「foo」というの複数の呼び出しを持つことです。私が知っている唯一の方法は、それが別のルーチン「foo1の」になるように、「foo」というの2回目の呼び出しで共通ブロックおよび関連のサブルーチンの名前を変更することですので、私は行うことができます。

programe new_control_routine() 
... 
call foo(a1,b1,...) 
... 
call foo1(a2,b2,...) 

しかし、これは確かに平凡で、エラーを起こしやすい。

答えて

1

共通ブロックのポイントは、それらがグローバルであり、その名前を使用する任意のルーチンにアクセス可能であることです。共通ブロック配列の変数を作成し、インデックスを渡すことで、異なる呼び出しが異なる要素にアクセスできるようにすることができますか?

なぜあなた自身をFORTRAN 77に制限しますか? Fortran 95/2003では、ユーザー定義の型を作成し、その型の配列変数を作成できます。次に、作業したい要素のインデックスを渡します。ユーザー定義タイプは、複雑な変数グループにすることができます。変数は、サブルーチンへの引数またはモジュール変数のいずれかになります。

+0

残念ながら、これは従来のコードであり、私は過去20年間に行われたことに従うこと以外に多くの選択肢がありません。そこには何百もの共通ブロックがあります。そして、インデックスのアイデアに感謝します。 – taki

+1

@taki - 理由がわからないためにコードを変更したくない他のユーザーがいない限り、最新のリビジョン(少なくともF90)にアップグレードすることはできません。今日、F77を擁護しているのは、控えめな見方であっても、不合理です。ライブラリが新しいリビジョンにアップグレードされると、多くのユーザーが歓迎されます。私は書き直しを考えていませんが、言語の新しい機能の遅い導入... – Rook

+0

@ldigas - ありがとう。それは最終的にここで人々がすることかもしれません。 – taki