• 締切済み

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

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

みんなの回答

  • chayamati
  • ベストアンサー率41% (254/607)
回答No.2

>Fortran95 懐かしいですね、私は1980年代COBOLで販売管理、会計等のシステム開発に携わってました。現場にリリース後不都合が起きたり、改善要求が出た時はに見直すのが大変でした。開発グループで約束したことはt次の3つです。 1.変数は全て明示宣言 2.Goto文は使わない。フラグがOkになるまでループする 3.メインルーチンもサブルーチンも50行以内にする

  • tetsumyi
  • ベストアンサー率26% (1854/7079)
回答No.1

今時のプルグラミングではどんな言語でも関数化は当たり前でほとんど全ては部品として作成して呼び出すだけです。 https://amanotk.github.io/fortran-resume-public/chap07.html 関数の受け渡しだけ気をつければ何の問題もありません。

関連するQ&A

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

    以下のような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の専門家はいろんなことに通じていると思うのでここにお尋ねしました。よろしくお願いします。

  • 副プログラムの変数について

    Fortranなのですが、以下のようなプログラムがあります。 call sub1 call sub1 end subroutine sub1 !save a write(*,*) a a=1.0 return end sub1というサブルーチンをメインから2回呼び出すだけです。そのサブルーチンの中の変数aですが、2回目に呼び出されたときに1回目に設定したa=1が保持されているようです。2回目の呼び出しで1回目に設定したa=1に対応した出力になっています。 Fortranはこのような動作をするのでしょうか。save aをコメントアウトしているのです。save aを指定したときだけそうなると思っていたのですが。cなどは細々とした設定ができるだろうと思います。このサンプルコードは実際にそうなっているという実験なのですが、どういう風に解釈したらいいでしょうか。〇〇保存属性とかです。昔からこうだったのでしょうか。使用したのはgfortran ver.9.3ですが。 

  • フォートランのサブルーチンの内部変数

    すみません。科学技術系の人間でして、フォートランが現役なのです。 あるプログラムのことですが、サブルーチンの内部の変数についてサブルーチンを呼び出すごとに加算していくようなことを行っています。 do i=1,100 call abc(i)   ← サブルーチンabcを100回呼び出す enddo end subroutine abc(i) n=n+1        ←呼び出されるたびに和をとる。 write(*,*) n return end このようなシンプルなプログラムは問題ないのですが、少し複雑になるとどういうわけか、呼び出される度にnが初期化され、writeさせた結果常に1が表示されるという現象に会いました。 昔のコンパックフォートラン(MS-Fortran, DEC Fortranを継承)と、最近のIntel Fortran(最新版)で動作が異なります。前者では和を取ってくれますが、後者では初期化されて常に1が出力されます。(上記のプログラムは問題なしです。もう少し長いプログラムでの問題です。) 言語仕様の問題(すなわちフォートランのバージョン)なのか、コンパイラ仕様の問題なのか、C言語のように宣言の仕方で変ったりするようになったというようなことはないでしょうか。 以下に示すように和をとる変数をメインプログラム側に一旦見えるようにすると、インテル版でも思ったとおりの動作をします。 call abc(i,n) suboroutine abc(i,n) としてnをメイン側に露出する。 よろしくお願いします。

  • 配列サイズを明示せずサブルーチンに渡す方法

    プログラムのメインの方で2次元、3次元の高次元配列を設定してそれをサブルーチンに引き渡すことを考えています(しょっちゅうやっていることですが)。 この場合、サブルーチン側に汎用性を持たせるためにできるだけ配列のサイズを自動で渡すようにしたいと思っています(メインが変わるとそれに応じて自動対応)。そうしないとサブルーチンが汎用化せず、ケースバイケース(メイン側の配列のサイズが変わる場合それに応じてコードを書き変えなければならない)に応じなければならず、うっかりミスの間違いもおこりそうです。 配列のサイズを決めないサブルーチンの書き方を教えて頂きたいのですが。 なお、今回は配列はデータとして参照するだけで書き換えることはありません。 言語ですが、”サブルーチン”というだけあってFortranです。(Cのカテゴリだと答えを頂けるかなと思っているのですが。他に適当なところも無いようですが)

  • 混合言語のデバッグ(VC++6.0,VF6.0)

    VCからFORTRANのサブルーチンを呼び出すプログラムを作ったのですが、FORTRANサブルーチンの変数がWATCHできなくて困ってます(DEBUG WINDOW→変数で表示されない)。どなたかアドバイスをお願いします。ちなみにサブルーチンの戻り値、参照値は正常です。

  • リファレンスをサブルーチンの戻り値にしてもOKですか?

    ■ サブルーチン内部で処理した結果を格納した、配列、ハッシュ、スカラーなどのデータを戻り値として利用する必要があります。その場合、どうするのが標準的なやり方でしょうか? ■ return (配列へのリファレンス, ハッシュへのリファレンス, スカラー); などとやってしまっても問題はないでしょうか? ■ 下のプログラムを試したところ、予想に反しちゃんと 「31415」と表示されました。 #!/usr/bin/perl -w sub subroutine{ my @a = (3, 1, 4, 1, 5); return \@a; } my $b = subroutine{}; print @$b; ■ サブルーチン内部で使用した変数へのリファレンスをサブルーチン 外で使っていいのだろうか? サブルーチンの処理が終了した時点でサブルーチン内部で使用した 変数はメモリーから消去されるのかと思ったものですから。

    • ベストアンサー
    • Perl
  • Fortranプログラムの戻り値を得る方法

    Fortranで作成したプログラム(exeファイル)をC言語プログラム(exeファイル)から 起動しようと考えています。 Fortran側のプログラム終了コードを取得したのですが、 そもそもFortranで作成したプログラムは起動元プログラムに戻り値を返せるのですか? (C言語のmain関数の戻り値のように) できない場合の解決策として、ファイルに終了コードを書いて両プログラム で共有しようと考えています。この方法は妥当でしょうか? 当方、Fortranは素人です。詳しい方がいましたら教えて下さい。

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

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

  • javascriptでサブルーチン化する方法

    現在、ホームページを作成しておりますが、node.js側(VisualStudioCode)にて条件分岐が複数あり、各々にinsert等の命令文が含まれる形となっております。 命令文は全体で約1,000個ありますが、同じ命令文が複数個所にあることからサブルーチン化して軽量化を図りたいと考えております。 ネットで調べましたが、これといった解決策が見つからなかったため、ご教示願います。

  • Visual C++とVisual Fortranの変数を共用したい

    FORTRANで作成したサブルーチンを活用し、C++からコールする形でコードを再利用しようと考えています。 C++からFORTRANを呼び出すのはすぐに出来たのですが、データの引渡しで困っています。 FORTRAN側ではグローバルな変数を多数(100個以上)宣言しており、引数としては渡せないのでC++側でも同名の変数を宣言して共用し、データのアクセスをしようと目論んでいます。FORTRAN側のコードは極力触りたくありません。 しかし、FORTRANでexternに相当する宣言の仕方が分からず、うまく同じ領域を共用できるようになっていません。 具体的にどんなことをすれば良いのかご存知の方がいらっしゃいましたら、ぜひご教授願います。 宜しくお願いします。

専門家に質問してみよう