• 締切済み

2つのプログラムを結合するテクニックについて

2つのプログラムがあり、別々に動作しているものがありますが、これらを結合して別の1つのプログラムをつくることを考えています。結合のイメージは例えば、2つのプログラムが海の計算と大気の計算であり、それらを結合して海洋・大気計算プログラムとする、というようなものです。2つの計算は海面を通じて接していることになります。海面が両計算の共通部分となります。また、それ以外に円周率とか重力加速度とかネイピア数といったユニバーサルな定数も共通になるはずです。 このようなものを作成する場合、メモリ管理(モジュール)としてどのように作りこんでいくことになるでしょうか。海モジュール、陸モジュール、共通モジュールの3モジュールにするということなのでしょうか。つまり、海は海・共通モジュールで計算し、大気は大気・共通モジュールにするとかです。他に共通部分をグローバル変数として認識させるとか、あるいは副プログラム(関数かサブルーチン)の引数として表に出すとか方法はありそうですが、1つの数字ではなく、ある程度大量の配列変数になるはずです。 そのあたりのメモリの管理の考え方についてテクニックを教えて頂きたいのですが。また、海、大気それぞれがとりあえずちゃんと走っている場合、結合する編集部分を最低限(ミスも最低限になる)にするテクニックがあると助かります。 実際はFortran95系でコードにしますが、C系での考え方を参考にできると思っています。よろしくお願いします。

みんなの回答

回答No.2

こういったことは、個々の問題ではなく誰が見ても解りやすく設計するのが妥当と思います。なぜならあなたが作成したプログラムを一生あなたが管理するとは限らないからです。作成後、色々な人が引き継いだりその時に、苦労して作成したものがある人にとっては非常に柔軟性に欠け破棄される可能性もあるかと思います。或いはそのプログラムを解読する時間を天秤にかけ新規に作り直したほうが良い可能性があると判断されるかもしれません。 その時あなたが悲しい思いをすることでしょ!

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

意地悪したいわけではないのですけど、 処理を分析してどのようにまとめるか という事になるので、このようなQAサイトの回答欄程度に書けるようなテクニックというものはないですよ。 それにそれは「C系での考え方」とかではなくプログラミング言語全般に通用する事ですので、Fortranでだってやってる人はやってるはずです。 小手先のテクニックを学んで、できるようになった気分になりたいだけでしたら止めはしないですけど。

skmsk1941093
質問者

お礼

ご忠告ありがとうございます。 今、やろうとしていることは頑張ればやれないことはないという話ではあります。しかし、どうしてもコーディングが汚くなるというか、洗練されてこない感じがしてそれがミスを誘発しそうに思いました。 ”ぼんやりせずしっかり、作れば作れます”というところにとどまらず、やり方として一般化されているとか、特に方法が確立されているとか、そういうことかもと思っていました。C++が一般化してきたころ変数のスコープ(隠ぺいとかに関するケア)に対してステップアップして何らかの言及があったように思いました。さらに時代が下って何か進展ないかなと思っていたのですが。

関連するQ&A

  • プログラムの変数の分離と共通のための管理

    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伝授されているかもと思うのですが。

  • 物理数値シミュレーションの結合と通信

     数値シミュレーションの技法に関する質問です。(以下、長文ですみません)  2つの数値計算プログラムがあり、それぞれ単独で、まあ正常に動作しています。その2つのプログラムは別の例えで言うと、プログラムAは空、プログラムBは海というものに対応しており、海面という境界では通信する必要がある、というようなものです。プログラムA,Bを何とか結合して全体を含んだプログラムCを作りあげるのが一般的なのかもしれませんが、プログラムA、Bについてそれぞれにあまり手を加えず、通信ができる仕組み(ファイル入出力で対応など)を少しだけ付加してプロセスとしては別々に実行できないかなと考えています。A,Bともに時間的に変化していくので、境界面での通信もそのつど計算する必要があるのです。  まず、Aを実行して、あるところで一旦休止して、Bが動き始め、あるところで休止し、またAが動く...というようなことなのかなと思いますが。この場合、A,Bが交互に動くという意味で同時性がないように思われますが、Aが終わったあと、Bが後ろから追いかけてくるというイメージです。1つのアイディアですが、AからBを呼び出すことができれば、AがBを呼び出し、実行している間、Aは待っており、Bが終わったらまたAが動き出す(そのあとまたBが呼び出される)という方法です。  2つのプログラムは変数名が同じだったりするので変数管理が大変で間違いそうなのでできればソースを編集して結合するのはやりたくないと思っています。  Linuxのシェルスクリプトだったら何でもできるというのかもしれませんが、私は主にWindowsユーザで言語はFortran, シェルというよりバッチ(バッシュよりバッチ)という環境で使っています。(Fortran90以降はモジュールという考え方も出ているようですが、どんなものかなと思いますが。) 何かアイディアがあれば教えて頂きたいのですが。よろしくお願いします。 ※今回の質問はプログラム2つでしたが、うまくいったら3つ4つとなっていく可能性ありです。 ※適当なカテゴリが見つからず、Cのユーザだったらシステムのキモの部分から何でも知っているはずなので、このカテゴリにアップしました。

  • プログラムのサブルーチン・関数化の方法について

    プログラム作成法に関する包括的な質問です。 ある物理シミュレーションプログラムを作成してまあ、満足できるというか当たり前の計算結果にはなりました。 それなりに複雑ではあり、それでおしまいにしたいところですが、本当はそれはもっと大きなプログラムの一部になるものです。ちゃんと動作したからこそ、パーツとして役に立つな、ということです。そこで、それをサブルーチンなり、関数なりにして外部から呼び出すように変更していくうまい方法がないでしょうか。全体を考えて構築しなおすべし、ということになるのか、あるテクニックでうまく処理できるということはないでしょうか。モジュールとかパッケージ化とかの技法で比較的簡単に処理できるとかです。変数名の重複(同じものであっても区別してもらいたい)とか変数のスコープとか呼び出し側、呼ばれ側の通信についてです。そういうのが得意なのがC++だろうとは思いますが、できればFortranで処理したいのです。Fortran95はgfortranがあるので利用できます(これは誰でもでしょうが)。 以前から全く前進しない問題で、仕方ないから全部考え直すとして組み上げていくことが多いです。私は普通はまず全体を作ってから細かいパーツに入っていくようにしますが、今回はその逆の行き方なのですが。プログラム開発に多くの人が関わるようなものだと、一人一人のコンセプトで作成して他のプログラムとのつなぎの部分だけちゃんとしていればよし、というようになっていると思いますが。gitとかsubversionとかです。 具体的な質問ではないですが、考え方をお尋ねしたいと思います。参考になるサイトとか情報でも結構です。よろしくお願いします。

  • プログラミングテクニックについて(C言語).

    こんにちは.私は,大学でアプリケーションソフトをつくる作業を研究の一環としてやっています.C言語でコードを書いているのですが,計算処理の高速化を 実現したいと切に願っております. 例えば,以下のように2つの関数main とTest,があるとします. そのとき,Testは計算結果を返さないとします. #define MAX 100 void Test(i,j data); int main(void) { double data[MAX][3] for (i = 0; i <= MAX; i++ ){ for (j = 0; j <= MAX; j++){ // Test(i,j data); } } return 0; } この場合,毎回Test関数を呼ぶたびにdata配列を指すポインタを 渡し,さらにTest()関数内に定義されているローカル変数用のメモリ領域も 確保されます. ということは,処理を高速化するためには なるべくTest関数内の変数を できるだけへらせばいいのでしょうか? みなさんがプログラムを組むときに留意されているテクニックを 教えて頂きたいです. できればVC++ver6.0でのデバックツールをどのように つかってバグフィクスしておられるのかうかがいたいです. 以上、よろしく御願い致します.

  • システムプログラム

    最近情報科学に興味があって、システムプログラムについて1から勉強している者です。いくつかの質問のある参考書で勉強していますが、答えが書かれていないので分かりません。 用語については調べたりはしてみましたが、実世界と結びついた問題にはいまいち対応できません。まだ知識不足なので深い所までは理解できないかもしれませんが、徐々に分かっていけたらと思っておりますので、もし誰か分かる方がいらっしゃったら簡潔で結構ですので教えてください。ヒントやキーワード、考える観点だけでも構いません。 宜しくお願い致します。 1、近年プロセッサやメモリの著しい速度向上に対し、ディスクの速度向上は著しくない。仮想記憶を用いているオペレーティングシステムに対して、どのような変更を施すべきか? 2、WEBブラウザや表計算ソフトウェア等のプログラムは多くのモジュールからなり、いずれかのモジュールにおいてバグが発現した場合、プログラム全体が止まってしまう。このような問題を軽減するために、システムプログラムにおいて改善できる点は何か?また、ユーザプログラムにおいて改善できる点が何か? 3、ベクトルの要素をソートするMPIのプログラムを考える。どのようなプログラムを書けば、哲学者の晩餐問題に陥るだろうか。また、そのような問題を避けるためにはどのようにプログラムを書けばよいだろうか? 3問ともでなくとも、分かる問題があるようでしたらご投稿お願い致します。

  • 統計学 分散の加法性と正規分布の一次結合

    分散の加法性と正規分布の一次結合って矛盾していませんか? 正規分布に従う確率変数X1,X2がそれぞれ統計的に独立である場合、それぞれの母分散σ1^2,σ2^2の和σ^2を考えます。 正規分布の式に直接あてはめ一次結合を考えると以下の式が成り立ちます。 σ^2=σ1^2+σ2^2 しかし、母分散の定義式に従って計算すると以下の結果になります。 σ^2=σ1^2+σ2^2+2*σ12 ここで、σ12の共分散です。統計的に独立であっても共分散が0である保証はないので、下の式のほうが厳密であるように思います。しかし、QC(品質管理)検定の問題では無視されており、一次結合に至っては0です。なぜこのような矛盾が生じるのでしょうか?

  • vbaについて。

    お世話になっております。 AccessVBAの初心者です。 subプロシージャのボタンクリックイベントから共通モジュール(Public)の動作を呼び、変数の加減乗除の計算をさせたいです。 共通モジュールの中をif文にする時、if「(subプロシージャの)ボタンが押された」時という記述はどのようにすれば良いでしょうか。 よろしくお願いします。

  • ハードウェアアーキテクチャ?

    ハードウェアアーキテクチャ? プログラムがコンピュータで実行されるまでの筋道が知りたいです。 C言語を勉強していたのですがmalloc();などの動的メモリの部分や #pragmaを使って変数のパッキングを弄る方法、部分的にアセンブラ命令を書いて処理を軽くするインラインアセンブラなどのテクニック、 レジスタ上にメモリを確保するregisterをつけて変数を宣言する方法など、ハードウェアに近い根幹的部分のほうを知りたいです。 メモリにしろヒープ領域とスタック領域があるだとかC言語の入門書には載っていないことがよくあります。 CPUの仕組みや、メモリの動作や、根本的なことが知りたいです。 このようなハードウェア寄り?なことを専門に扱っているHPや本などありましたら教えてください。

  • 結合されたセルの一覧出力 VBA

    お世話になります。 結合されたファイルの一覧を出力したいと思っています。 (できれば、変数に出力したいです) 表があり、ばらばらな範囲で結合されています。 結合した部分には、日付が入っています。 日付が入っている列は、B列とH列で、 その中で「AA」「BB」と入力されている結合セル以外の 結合セル範囲?行?を取得したいと思っております。 B列とH列の結合セル行が同じではありません。 B列は、B5:B13、B18:B25、B30:37 (それ以外のセルは結合してあっても、「AA,BB]と書いてある H列は、H6:H13,H18:H25、H30::H35,H36:H40(上と同じ) ということになっております。 できれば、 1.セル結合範囲を検索(行数取得?) 2.セルの内容が日付かどうか確認 3.日付なら、セル行数を取得 ということがしたいです。 日付の形式は、3/1などのように入っています。 このフォームが結構変わるため、 結合しているセルの中身が日付かどうかを確認し、 日付なら行数取得→色んなプログラムでその行数を使用 したいと思っています。 分かりにくい部分が多いかと思いますが、 回答お願い致します。

  • VBAで後半部分のバグフィックス

    VBAで作成した長いプログラムがあり、 前半は完成しているのですが、後半が未完成で作りかけのものがあります。 しかも変数・配列が多量に使用されています。 後半の部分のプログラムを動かすためには 前半の計算を行う必要があるのですが、 後半の計算のバグを直すために何度もやり直すのに時間がかかってしまいます。 前半の計算で行った変数の代入を保持したままでVBAの計算を終了し、 後半の計算の手前から計算を行うようなことをしたいのですが このようなことは可能でしょうか? もし、無理だとして、このような長いプログラムで、しかも変数が多いような 場合どうやって一部(特に後半部分)のプログラムのバグフィックスを行えば良いでしょうか?

専門家に質問してみよう