そろそろプログラムも長くなってきたので、 間違いを見付ける(「バグをとる」)のが大変になってきましたね。 間違いを見付ける「古典的な」方法は知っておいた方が良いでしょう。
具体的には、各自の 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 宣言をして いなかったため、呼ぶ側では倍精度実数と思っているのに、 呼ばれる側では単精度実数扱いしているのでした。