私は Fortran にまったく慣れておらず、プログラミング全般にかなり慣れていません。他の誰かが書いたスクリプトをコンパイルしようとしています。これは私にいくつかの問題を与えています。コードの上半分は次のとおりです。
C
C Open direct-access output file ('JPLEPH')
C
OPEN ( UNIT = 12,
. FILE = 'JPLEPH',
. ACCESS = 'DIRECT',
. FORM = 'UNFORMATTED',
. RECL = IRECSZ,
. STATUS = 'NEW' )
C
C Read and write the ephemeris data records (GROUP 1070).
C
CALL NXTGRP ( HEADER )
IF ( HEADER .NE. 'GROUP 1070' ) CALL ERRPRT(1070,'NOT HEADER')
NROUT = 0
IN = 0
OUT = 0
1 READ(*,'(2i6)')NRW,NCOEFF
if(NRW .EQ. 0) GO TO 1
READ (*,'(3D26.18)',IOSTAT =IN) (DB(K),K=1,NCOEFF)
DO WHILE ( ( IN .EQ. 0 )
. .AND. ( DB(2) .LT. T2) )
IF ( 2*NCOEFF .NE. KSIZE ) THEN
CALL ERRPRT(NCOEFF,' 2*NCOEFF not equal to KSIZE')
ENDIF
C
C Skip this data block if the end of the interval is less
C than the specified start time or if the it does not begin
C where the previous block ended.
C
IF ( (DB(2) .GE. T1) .AND. (DB(1) .GE. DB2Z) ) THEN
IF ( FIRST ) THEN
C
C Don't worry about the intervals overlapping
C or abutting if this is the first applicable
C interval.
C
DB2Z = DB(1)
FIRST = .FALSE.
ENDIF
IF (DB(1) .NE. DB2Z ) THEN
C
C Beginning of current interval is past the end
C of the previous one.
CALL ERRPRT (NRW, 'Records do not overlap or abut')
ENDIF
DB2Z = DB(2)
NROUT = NROUT + 1
print*,'Out =', OUT
WRITE (12,REC=NROUT+2,IOSTAT=OUT) (DB(K),K=1,NCOEFF)
print*,'Out2 =', OUT
IF ( OUT .NE. 0 ) THEN
CALL ERRPRT (NROUT,
. 'th record not written because of error')
ENDIF
したがって、「Out」と「Out2」を画面に出力すると、Out=0 と Out2=110 であることがわかります。もはやゼロに等しくないので、プログラムはエラーを出します。したがって、私は基本的にここで何が起こっているのか疑問に思っています:
WRITE (12,REC=NROUT+2,IOSTAT=OUT) (DB(K),K=1,NCOEFF)
12 は、私が開いた (そして作成した) ファイルを参照し、書き込みたいと仮定します。最初のブラケットの残りの部分は何をしますか? そして、2番目のポイントは何ですか?ファイルに入れたい情報が得られますか? 場合によっては、DB はどこでそれで満たされますか?
一般的に、何がうまくいかないのだろうか?OUT が値を変更するのはなぜですか? (私はtが必要です
NCOEFF はプログラムの冒頭で整数として定義されており、DB: は DOUBLE PRECISION DB(3000), DB2Z/0.d0/ として定義されているため、DB は何らかの配列であると想定しています。