3 サブルーチン副プログラム

3.1 どのような時につかうか

関数副プログラムの場合、入力の変数は複数個でも良いが、出力(戻り値)は1 個に限ります。それは文法から明らかでしょう。それに対して、サブルーチン 副プログラムは、複数の値を返すことができます。

3.2 実際のプログラム

教科書の例を用いて説明しよう。教科書のプログラムは分かりにくいので、実 際、通常のプログラマーが記述するように書くと以下のようになります。この プログラムでは、パイプの外径と内径、長さ、密度を与えて、体積と重さを計 算しています。それを、SUBROUTINE PIPEで計算しています。

最初のCALL文では、キーボードから入力された、外径(A)と内径(B)、長さ (L1)、密度(G1)を使って、体積(V)と質量(W)を計算しています。

2番目のCALL文では、直接サブルーチンに値を与えています。すなわち、外径 を8.0、内径を6.0、長さを350.0、密度を7.8として、体積(V)と質量(W)を計算 しています。

 *=======================================================
 * MAIN ROUTINE
 *=======================================================
      PROGRAM MAIN
      REAL A, B, L1, G1, V, W

      READ(5,*)A, B, L1, G1
      CALL PIPE(A, B, L1, G1, V, W)
      WRITE(6,600)V,W

      CALL PIPE(8.0, 6.0, 350.0, 7.8, V, W)
      WRITE(6, 600)V,W

  600 FORMAT('V=',E15.8, ' W=', E15.8)
      
      STOP
      END

 *=======================================================
 *     SUBROUTINE OF PIPE CALCULATION
 *=======================================================
      SUBROUTINE PIPE(X, Y, L, G, V, W)
      REAL X, Y, L, G, V, W

      V=3.14159/4.0*(X*X-Y*Y)*L
      W=V*G

      RETURN
      END

このプログラムをサブルーチン副プログラムを使わないで書くと、以下のよう になります。分かりにくいし、パイプの断面が、円から、正方形に変更になっ た場合、同じような部分を2箇所書き直す必要があります。それに比べて、サ ブルーチン副プログラムだと、サブルーチン内を書き直すことで済みます。こ れは、プログラマーの労力を格段に減らすことができます。

      PROGRAM PIPECAL
      REAL A, B, L1, G1, V, W

      READ(5,*)A, B, L1, G1
      V=3.14159/4.0*(X*X-Y*Y)
      W=V*G
      WRITE(6,600)V,W

      CALL PIPE(8.0, 6.0, 350.0, 7.8, V, W)
      V=3.14159/4.0*(8.0*8.0-6.0*6.0)*350.0
      W=V*7.8
      WRITE(6, 600)V,W

  600 FORMAT('V=',E15.8, ' W=', E15.8)
      
      STOP
      END

3.3 サブルーチン副プログラムの文法

3.3.1 サブルーチンの呼び出し

サブルーチンは、CALL サブルーチン名で呼び出します。データの受け渡しは、 引数で行います4。関数副プログラム同様、実引 数並びは、複数個が許されます。また、配列も許されます。ただし、実引数と 仮引数の数と型は一致させる必要があります。
      CALL サブルーチン名(実引数並び)

3.3.2 サブルーチンの定義

サブルーチンでの処理の定義は以下のように行います。すなわち、 SUBROUTINEと最初に書いて、その後、仮引数が並びます。それから、通常のプ ログラムのように書いて、RETURNとEND文で終わります。

仮引数並びと実引数並びは、同じ数で型でなくてはなりません。ただし、引数 の変数名は異なっても、何ら問題はありません。関数の処理の部分は、今まで 学習してきたFORTRANのプログラムを書けばよいのです。計算のみならず、 WRITE文やREAD文も書けます。

サブルーチン副プログラム内で使われた変数は、引数以外は全く、メインルー チンに影響を及ぼしません。メインルーチンと同じ名前の変数が使われていて も、その結果が反映されることはありません。

      SUBROUTINE サブルーチン名(仮引数並び)
      宣言文
    
    実行文(関数の値を求めるための処理)

    RETURN
      END



ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年8月20日


no counter