私はFortran90で、テキストファイルからの入力を何百も読み取り、それらに対して多くの異なる順次操作を実行するプログラムを作成しました。
これらの数百の値を各サブルーチンに渡し続けたくありません(たくさんあります!)。このファイルから読み取ったデータを、任意のサブルーチンからアクセスできるグローバル変数に保存する方法はありますか?どういうわけか、これらの値を各サブルーチンから呼び出すことができるモジュールに保存できると思いますが、その方法がわかりません。
変数をモジュールに配置し、各サブルーチンからそのモジュールを使用するだけです。または、同じモジュールにサブルーチンを配置します。これは、最新のFortranのグローバル変数に対する推奨されるアプローチです。一般的なブロックよりも優先されます。共通のブロックは、ストレージシーケンスの不必要な複雑さを追加します。原則として、各宣言にSAVEを含める必要があります。これは、モジュールがスコープ外になると、つまり、プログラムの実行中にメインプログラムもサブルーチンもモジュールを使用しない場合に、値が失われる可能性があるためです。おそらく、実際にこれを行うコンパイラはありません。
module my_mod
real, dimension (100) :: array
integer :: OneInt
contains
subroutine X
end subroutine X
end module my_mod
program my_prog
use my_mod
read () array
call subroutine X
end program my_prog
モジュール変数の使用と直交して、1つ以上の派生型を使用して「数百の値」をグループ化することを検討してください(特定の派生型にグループ化されている何らかの方法で関連する値を使用)。
(より基本的なレベルでは、一連のスカラーではなく配列での情報の表現が、その情報の性質により適している場合があります。そのため、その情報を配列に格納して渡します。)
これにより、プログラム内の情報フローをはるかに理解しやすくなります。プロシージャ参照のサイトでは、コードを読んでいる人が、参照されているプロシージャがアクセスする可能性のあるモジュールやモジュール変数を必ずしも認識していません。場合によっては、将来的にプログラムを拡張することも簡単になります。一連のモジュール変数としてではなく、派生型で記述されている場合は、複数の現存するインスタンスを作成する方が簡単です。
したがって、代わりに:
SUBROUTINE proc( temperature, pressure, &
composition_a, composition_b, composition_c )
REAL, INTENT(IN) :: temperature, pressure, &
composition_a, composition_b, composition_c
...
検討:
TYPE State
REAL :: temperature
REAL :: pressure
REAL :: composition(3)
END Type State
...
SUBROUTINE proc(system_state)
TYPE(State), INTENT(IN) :: system_state
...
他の場合には、モジュール変数の方が適切かもしれません-分割は判断の問題です。