最初の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
となります。要するに、引数を除いて、メインルーチンとサブルーチンの変数
の格納領域は異なるということです。名前が異なっていても、実引数と仮引数
は同じ領域にデータが格納されます。一方、その他の変数は名前が同じでも、
異なった領域にデータは格納されます。