そろそろプログラムも長くなってきたので、 間違いを見付ける(「バグをとる」)のが大変になってきましたね。 間違いを見付ける「古典的な」方法は知っておいた方が良いでしょう。
具体的には、各自の Home Directory にある環境設定ファイル
.cshrc の 次に、set path=... の部分に
/home1/s-0007/bin
を追加してください。
--> set path=(./ /home1/s-0007/bin /usr/local/bin /usr/gnu/bin /usr/bin/X11 $path )
(前回の環境整備で現在の directory ./ を付け加えていない人は今回ついでに付け加えましょう。 path= の最初に "./ " (ドット スラッシュ スペース) を加えて下さい。
編集が終ったら環境を更新します。
これで ftnchek コマンドが使えます。
program progXX implicit real*8(a-h,o-z) x=1.0d0 y=1.5d0 z=x+y write(*,*) w end次のように怒られます。
ap1 71: ftnchek progXX.f FTNCHEK Version 2.11 July 1999 File progXX.f: Warning in module PROGXX file progXX.f: Variables set but never used: Z Variables used before set: W 0 syntax errors detected in file progXX.f 2 warnings issued in file progXX.f ap1 72:used before set は値を与える前に変数を使っている、ということです。 x, y, z は与えていますが、w は与えていませんね。
program prog06 implicit real*8 (a-h,o-z) .... call onestep(x,y,vx,vy,t,dt) .... end c ********************************************************************** subroutine onestep(x,y,vx,vy,dt) c ********************************************************************** c Force at x,y call force(x,y,fx,fy) .... end ...このプログラムはコンパイルで「エラーはありません」と出るのに 走らせると「Bus error (core dumped)」という訳の分からないメッセージを 出して止まります。ftnchek で調べてみましょう。
ap1 87: ftnchek prog06.f FTNCHEK Version 2.11 July 1999 File prog06.f: 0 syntax errors detected in file prog06.f Subprogram ONESTEP: varying number of arguments: Defined with 5 arguments in module ONESTEP line 40 file prog06.f Invoked with 6 arguments in module PROG06 line 31 file prog06.f Subprogram ONESTEP: argument data type mismatch at position 1: Dummy arg X is type real in module ONESTEP line 40 file prog06.f Actual arg X is type real*8 in module PROG06 line 31 file prog06.f ....0 syntax errors detected... と出ているので、確かにそれぞれの部分(メインプログラム、副プログラム) でのエラーはありません。しかしつなぐと間違いになるエラーがあるのです。
varying number of arguments は「引数の数が合っていないよ」というメッセージです。 良く見ると onestep を call するときには 6 つの引数を与え、 subroutine の部分では引数が 5 つになっています。 メインプログラムと subroutine は「引数の順番」で情報をやりとり しているので、上の例ではメインプログラムの t をsubroutine 内では dt として扱ってしまうのです。
argument data type mismatch は「変数の型が合っていないよ」というメッセージです。 良く見ると subroutine onestep で implicit 宣言をして いなかったため、呼ぶ側では倍精度実数と思っているのに、 呼ばれる側では単精度実数扱いしているのでした。