最初の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
CALL サブルーチン名(実引数並び)
仮引数並びと実引数並びは、同じ数で型でなくてはなりません。ただし、引数 の変数名は異なっても、何ら問題はありません。関数の処理の部分は、今まで 学習してきたFORTRANのプログラムを書けばよいのです。計算のみならず、 WRITE文やREAD文も書けます。
サブルーチン副プログラム内で使われた変数は、引数以外は全く、メインルー チンに影響を及ぼしません。メインルーチンと同じ名前の変数が使われていて も、その結果が反映されることはありません。
SUBROUTINE サブルーチン名(仮引数並び) 宣言文(引数や変数などの宣言を行う) 実行文(関数の値を求めるための処理) RETURN END
*======================================================= * 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となります。要するに、引数を除いて、メインルーチンとサブルーチンの変数 の格納領域は異なるということです。名前が異なっていても、実引数と仮引数 は同じ領域にデータが格納されます。一方、その他の変数は名前が同じでも、 異なった領域にデータは格納されます。