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

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

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

5.2 実際のプログラム

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

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

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

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

5.3.2 サブルーチンの定義

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

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

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

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

       RETURN
       END

5.4 サブルーチン副プログラムの注意事項

呼び出し側の変数とサブルーチン副プログラムの変数は、引数を除いて完全に 独立です。引数は、その並び方の順序で、呼び出した側と呼ばれた側で完全に 一致します。これを、以下の例をもって、示します。
 *=======================================================
 * MAIN ROUTINE
 *=======================================================
       INTEGER I,J,K,M

       I=2
       J=3
       K=4
       CALL WA(I,J,M)

       WRITE(6,601)I,J,K,M
   601 FORMAT('I=',I2,'  J=',I2,'  K=',I2,'  M=',I2)

       STOP
       END

*=======================================================
* SUBROUTINE
*=======================================================
       SUBROUTINE WA(M,N,K)
       INTEGER I,J,K,M,N

       I=99
       J=99
       K=M+N
       M=88
       N=77

       RETURN
       END

このプログラムを実行するとその結果は、

      I=88  J=77  K= 4  M= 5
となります。要するに、引数を除いて、メインルーチンとサブルーチンの変数 の格納領域は異なるということです。名前が異なっていても、実引数と仮引数 は同じ領域にデータが格納されます。一方、その他の変数は名前が同じでも、 異なった領域にデータは格納されます。


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


no counter