• 締切済み

隔絶されているサブルーチン間の通信の方法

以下のようなFortranのサブルーチンとモジュールがあります。これを見ると、サブルーチンA,Bはモジュールa,bが別なのでデータ的に隔絶されていることになります。もし、このような場合、サブルーチンA,Bの間で何らかの変数を共有するようなことをしたい場合、どのような方法があるでしょうか。サブルーチンの引数を使うのは混乱の原因になりそうなので、できればmoduleの方で処理できないかと思うのですが。 混乱しそうなところなので、やり方をいろいろ比較して見てみたいと思います。Cではグローバル変数のように全体で共有する変数を用意するのかなと思いますが。 module a end module module b end module subroutine A use a end subroutin B use b end Fortranについてはここでは特設会議室はありませんが、どこかいいところがあるでしょうか。Cの専門家はいろんなことに通じていると思うのでここにお尋ねしました。よろしくお願いします。

みんなの回答

noname#245936
noname#245936
回答No.2

んー。 であれば、マルチスレッドのプログラムを書くとか、実行ファイルを別にして、媒介にデータベースサーバ使うぐらいですかね。 マルチスレッドはよくある話で、例えばファイルをダウンロードするときに画面で進捗バーを表示しますが、あればファイルのダウンロードと進捗のバーは並列で処理しています。 片方が終わるまで待つと画面が固まっちゃいますので。 ただ、数値シミュレーションであればAプログラムとBプログラムがあって、Aプログラムが自分の実績を書いた後で、BプログラムがAプログラムの結果を見て動けばいいと思いますのでデータベースさえあればいいように思います。

noname#245936
noname#245936
回答No.1

FORTRAN 言語はわかりませんが、C言語など他の言語では、全体的にグローバル変数はより少ないに越したことがなく、変数のスコープはより狭い方がいいことだとされています。 グローバル変数よりモジュール変数、モジュール変数よりローカル変数がいいです。 理由は、大きいプログラムを書く時に、変数のスコープが広いとどこからでも変数中身がさわれてしまい、バグ箇所のトレースが非常に難しくなる点。 また、複数人で同時並行開発する際に、変数のスコープが広いものばかりだと分業化しづらく、互いに変数を潰し合うから。 さらに、各モジュールが簡潔にまとまって独立性が高いと、他のプログラムにそのまま流用しやすくなり、開発期間と費用が落とせるためです。 それの最たるものかフレームワークやライブラリなどですね。 命令を書くだけで、中の詳細処理が分からなくても処理ができるのが理想です。 試しに10,000行超えるようなプログラム書くと分かります。自分で書いたプログラムが、スコープが広い変数が多いと、途端に訳がわからなくなります。 こういうのをオブジェクト指向とか、パッケージングとか、ボクシングど言ったかと思います。

skmsk1941093
質問者

お礼

回答ありがとうございます。今回のものは2つの通信がないとやる意味がないものになっています。物理数値シミュレーションのようなもので、例えば海と空を別々に計算するけど、両方が接している海面では相互作用してしまうということになります。ここで情報共有が必要というわけです。 まさかの方法は外部ファイルに書き出して読み込むということです。データの共有が計算の律速となる部分(ホットスポット)ではないと判断してそうする可能性がなくはありませんが。やはり通信してほしいと思うのですが。オブジェクト指向のようなことになると自信がなくて足元が揺らぐ思いです。

関連するQ&A