そのために、この関数を定義して、いつでも呼び出せるようにすると便利です。 あたかも、のようにを入れれば、計算してくれるようにすれば非 常に便利です。一つの解決方法が文関数ですが、これは1行で関数を定義 する必要があるので、式(3)のようにIF文を使って、 場合分けが必要の時には使えません。文関数で定義できない複雑な関数を定義す るときに、関数副プログラムを使います。
もう一度、文関数と関数副プログラムの違いをまとめておくと次のようになり ます。
メインルーチンを見るだけで、このプログラムの動作が分かると思います。関 数F(X)の値をX=0.5から0.1ステップで1.5まで計算して、書き出していると想 像できます。実際の関数は、関数副プログラムを見ればすぐに分かるようになっ ています。
関数F(X)はどこからでも使うこともでき便利です。同じ処理を何回も書かない ですむということです。これは、関数を変えたい場合、プログラムを書き直す のは1箇所で済みます。これにより、プログラムは分かりやすくなり、作成時 間も非常に短くできます。
*======================================================= * MAIN ROUTINE *======================================================= PROGRAM MAIN DO 10 X=0.5, 1.5, 0.1 Y=F(X) WRITE(6,601) X,Y 601 FORMAT(2E20.8) 10 CONTINUE STOP END *======================================================= * USEER DEFINEDED FUNCTION *======================================================= FUNCTION F(X) IF(ABS(X).LE.1.0)THEN F=SQRT(1.0-X*X) ELSE F=0.0 ENDIF RETURN END
同様に、関数の戻り値の型と代入される変数の型も一致させる必要があります。
型 関数名 代入される変数=関数名(実引数並び)
関数の計算結果の型は、関数名の型宣言により決まります。もし、型宣言を行 わなければ、暗黙の型宣言になります。型宣言を行った関数副プログラムは、 次のようになります。
*======================================================= * MAIN ROUTINE *======================================================= INTEGER WA I=2 J=3 K=WA(I,J) STOP END *======================================================= * FUNCTION *======================================================= INTEGER FUNCTION WA(M,N) WA=M+N RETURN END
仮引数並びと実引数並びは、同じ数で型でなくてはなりません。ただし、引数 の変数名は異なっても、何ら問題はありません。関数の処理の部分は、今まで 学習してきたFORTRANのプログラムを書けばよいのです。計算のみならず、 WRITE文やREAD文も書けます。ただし、最後に関数名に値を代入する必要があ ります。これが戻り値になります。
関数副プログラム内で使われた変数は、引数以外は全く、メインルーチンに影 響を及ぼしません。メインルーチンと同じ名前の変数が使われていても、その 結果が反映されることはありません。
関数の型 FUNCTION 関数名(仮引数並び) 宣言文(仮引数などの宣言) 実行文(関数の値を求めるための処理) 関数名=処理の結果の関数の値 RETURN END
*======================================================= * MAIN ROUTINE *======================================================= INTEGER WA I=2 J=3 K=4 M=WA(I,J) WRITE(6,601)I,J,K,M 601 FORMAT('I=',I2,' J=',I2,' K=',I2,' M=',I2) STOP END *======================================================= * FUNCTION *======================================================= INTEGER FUNCTION WA(M,N) INTEGER I,J,K,M,N I=99 J=99 K=M+N WA=K M=88 N=77 RETURN ENDこのプログラムを実行するとその結果は、
I=88 J=77 K= 4 M= 5となります。要するに、引数を除いて、メインルーチンと関数副プログラムの 変数の格納領域は異なるということです。名前が異なっていても、実引数と仮 引数は同じ領域にデータが格納されます。一方、その他の変数は名前が同じで も、異なった領域にデータは格納されます。