- 締切済み
プログラムの変数の分離と共通のための管理
2つのFortranのプログラムがあります(P1,P2とします)両者は単体で動作しているとします。 ここでP1の出力結果を受けてP2が動くという風に改造したいと思います。すなわち、P1とP2を結合してP3ができるということになります。 そうすると、P1,P2をできるだけ簡単にサブルーチン化して (P3.f95の構造) do call p1 call p2 enddo という形にしたいと思いますが、問題は変数の管理・スコープになります。(ここでP1,P2はP3の内部ですが、プログラム単位は別といことでいいでしょうか。) call P1のためのモジュールm1とP2のためのm2となりますが、m1,m2がそれぞれ堅固にメモリ管理されて分離する部分と両者で共通してもいい部分があると便利になります。 2つのプログラム単位において変数を管理するモジュールに共通部分を作ることは可能でしょうか。 もし、これができないなら、P1が計算した結果をファイルに出力してP2が読む(その逆も)というファイルを介した通信となってしまいますが、得策ではないと思っています。 いかがでしょうか。 Fortranということになりますが、変数を管理する構造体・共用体によるCの管理がFortran伝授されているかもと思うのですが。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- superside0
- ベストアンサー率64% (461/711)
あっと、私のほうこそ、御質問を読み間違えておりました。 マルチコアCPUとかマルチプロセッサとか使って、 p1とp2を別々のプロセスで同時実行させながら、 その間でメモリーの内容を引き渡したいのかと 勘違いしておりました。 p1プログラムとp2プログラムを順に実行するだけのことなら、 単にそれぞれをサブルーチン化して、 その間で変数の引き渡しすれば事足りるので、 それなら、既に回答されていますね。 失礼しました。
- superside0
- ベストアンサー率64% (461/711)
御質問に call p1 call p2 って書いてあるし、 C言語の構造体とか共有体とかの話も出てきてるので 単に 2つのサブルーチンをコールしている1本のプログラム内で サブルーチン間で変数の中身をどうやって引き渡しするかだけのことと 誤解してしまいそうですが、ご質問は、そういうことではなくて p1という実行ファイルと p2という実行ファイルがあって、 完全に独立したプロセス空間で動かすのだけど p1の結果の入った変数の中身を そのままp2に引き渡したいってことですよね? (普通にやるなら変数の中身をシリアライズしてファイル化して 引き渡すところを) そういうのは、プロセス間通信って呼びますが、 パイプを使うとか ソケット開いて通信するとか 共有メモリを使うとか(ちゃんと排他制御しないとメモリ内容を壊しますが) メモリーマップドファイル(共有ファイルを仮想的なメモリーとして使う感じ) とか、いろいろと方法はありそうですので そのあたりでFortranの実装方法を調べられては如何でしょう。 (というかOSの機能にも依存するので、OSの調査も必要ですが)
- wormhole
- ベストアンサー率28% (1626/5665)
>両者で共通してもいい部分があると便利になります。 モジュールm1とモジュールm2がこっそり共有している変数なんて、 ずぼらな人にとって便利なだけで 設計上は・・・ダメな部類。
- f272
- ベストアンサー率46% (8469/18132)
こんな感じ。 module common_module double precision :: x END module common_module subroutine p1 use common_module print*,x," is written in p1" END subroutine p1 subroutine p2 use common_module print*,x," is written in p2" END subroutine p2 program p3 use common_module integer :: i x=1.0 do i = 1, 10 call p1 x=x+1.0 call p2 enddo END program p3
- chie65536(@chie65535)
- ベストアンサー率44% (8741/19839)
グローバル変数はpublicを、グローバルじゃないローカル変数はprivateを使います。
- asciiz
- ベストアンサー率70% (6803/9674)
Fortranは使っていませんが。 その様なことをしたいときは、「サブルーチン」ではなく「関数」にすると思います。 >Fortran 入門: サブルーチンと関数(自作手続) >https://www.nag-j.co.jp/fortran/FI_11.html つまりこんな感じ do b = p1(a) c = p2(b) enddo パラメータを指定して関数を呼ぶ、戻り値として値を受け取る、その様にすることで、メインルーチンおよび各関数の変数スコープはローカルで良くなります。 また、C言語で言う構造体は、Fortranでは構造型と呼ぶようです。 >Fortran 入門: 定数と変数 #4.6 構造型>https://www.nag-j.co.jp/fortran/FI_4.html#ExtendedTypes 関数パラメータ・戻り値を構造型にすることで、複数値のリターンもできるのかもしれません。