2

いくつかのシミュレーション コードを結合する作業を行っています。現在は 3 つのコードがありますが、将来的にはさらに増える可能性があります。次の図で情報交換を考えることができます。

 sim1  <====>  sim_main <=====> sim2

情報交換は、両側の限られたインターフェースを介して行われます。

私は最近、sim1 の共通ブロックが sim2 のサブルーチンと同じ名前を持ち、セグメンテーション違反を引き起こしている問題を診断しました。簡単な解決策は、sim1 の共通ブロックの名前を変更することですが、それは理想的ではありません。なぜなら、sim1 の開発者が sim1-2.0 を発表した場合、その共通ブロックの名前を掘り下げて再度変更する必要があるからです。インターフェイスは比較的限られているため、より良い解決策は単純なモジュールを作成することではないかと考えています。

module sim2_mod
contains
include "sim2.f90"
end

これにより、sim2 のすべてのルーチンが sim2_mod 名前空間に配置さuseれ、制限付きで使用できるようになります。これは良い考えですか?悪い考えですか?これが機能しない状況はありますか? sim2 で使用される一般的なブロックにはまだグローバル スコープがありますか?

4

1 に答える 1

4

提案された に接合されたときに、構文的に有効な Fortran ソース ファイルを形成するsim2.f90行のみが含まれている場合、提案は機能します。sim2_modそうでない場合は、ソースを編集する必要があります。

あなたがそれをしている間、とにかくそれをモジュールにして、sim_main. そこまで到達したら、ステートメントにonly名前を変更して句を追加し、名前の衝突をそのように回避できます。use

共通ブロックは実際にプログラム全体でグローバル スコープを持っています。Fortran 作成コミュニティ内のコンセンサスは、現在直面している問題だけでなく、このグローバルな可用性が引き起こす可能性のある問題を回避するための好ましい方法は、それらを置き換えることだと思います。共通ブロックに含まれるすべての変数を定義するモジュールを使用します。その後、モジュール変数を使用して、(以前の) グローバル変数の可用性と命名をもう少し制御できます。

このアプローチは実装が面倒で、 の次のリリースでsim1も再作業が必要になる可能性が高くなります。しかし、それなら、 の開発者にsim1、共通のブロックを削除して、もう少し新しいものを実装するように指示する時期ではないでしょうか?

于 2012-07-13T18:21:34.710 に答える