5

Fortran 90 で読み取りの問題が発生しています。31488 行のデータを読み取ろうとしています。Portland Group Fortran 90 コンパイラを使用しています。

私のエラーメッセージはこれです:

PGFIO-F-217/list-directed read/unit=14/ファイルの終わりを過ぎて読み取ろうとしています。ファイル名=/import/c/w/username/WRFV3/SKILLSETS/Overestimations.txt形式、シーケンシャルアクセス 記録=31489

Fortran プログラムは、余分な行があると認識しています。コードのどこにそれが示されているかわかりません。

コードの関連部分を添付しました...コードのこの部分を高低で検索し、テキストファイルを調査して、行数が一致するかどうかを確認しました。問題がどこにあるのか、私にはまったくわかりません。

コンパイラは、エラーが read ステートメントにあると述べています... do ステートメント内のコードのその行である read(14,*) で。

助けてください。どうもありがとうございました。

Program skillruss
! Purpose: to calculate skill scores

implicit none
integer :: i,j,nsite,ntime,iref,jj,csite

! nsite = number of observation sites, csites = number of chemical sites, ntime = number of hours

parameter(nsite=32,csite=1,ntime=984)

real :: Tob(nsite,ntime),RHo(nsite,ntime),diro(nsite,ntime)
real :: raino(nsite,ntime),swo(nsite,ntime),po(nsite,ntime)
real :: Tdo(nsite,ntime),vo(nsite,ntime)
real :: Ts(nsite,ntime),RHs(nsite,ntime),dirs(nsite,ntime)
real :: rains(nsite,ntime),sws(nsite,ntime),ps(nsite,ntime)
real :: Tds(nsite,ntime),vs(nsite,ntime)
real :: PMo(csite,ntime),PMs(csite,ntime)

real :: pers(csite,ntime)
real :: bias,rmse,sde,r,x,y,sx,sy,dw,isig
real :: countn
real :: nrmse,fac2,nstdev,mg,fb,nmse
real :: biast(ntime),rmset(ntime),sdet(ntime)
real :: rt(ntime),xt(ntime),yt(ntime)
real :: sxt(ntime),syt(ntime),isigt(ntime),countt(ntime),dt(ntime)


! Open file to read the observational data

open(14,file=&
"/import/c/w/username/WRFV3/SKILLSETS/Overestimations.txt",&
   form="formatted",status="old")

Tob= -999.
RHo= -999.
vo= -999.
diro= -999.
raino= -999.
swo= -999.
po= -999.
Tdo= -999.

do i=1,nsite
do j=1,ntime
read(14,*) Tob(i,j),RHo(i,j),vo(i,j),diro(i,j),raino(i,j),swo(i,j),&
    po(i,j),Tdo(i,j)
if(vo(i,j) <=0.)diro(i,j)=-999.
end do
end do
close(14)
4

2 に答える 2

8

通常、エラーが発生した理由を特定するには、データ ファイルを確認する必要があります。リスト指示入力は、エラーが検出された場所から遠く離れた場所で行われる間違いの影響を非常に受けやすくなっています。たとえば、エラーはレコード 31489 で報告されていますが、おそらくレコード 7233 の行には値が 1 つ少なすぎます。リスト指示では、自動的に次のレコードを読み取って欠落している値を取得し、残りの新しいレコードを破棄します。ライン。その後、最後のレコードに到達すると、もう 1 つ必要になり、エラーが発生します。

問題はプログラム ソースではなく、データ ファイルにあると確信しています。実際に必要な値を読み取っていることを確認するために、いくつかの検証を追加する必要があります。データ ファイルがどのようにフォーマットされているかにもよりますが、リスト指向ではなく、G フォーマットでフォーマットされた入力を使用することをお勧めします。リスト指向の入力 (および出力) に惑わされたプログラマーをあまりにも多く見てきました。

于 2013-08-01T20:20:12.680 に答える
0

修正として、ファイルの最後までの読み取りに相当する Fortran を使用できます。

do i=1,nsite
    do j=1,ntime
        read(14,*, end=10)Tob(i,j),RHo(i,j),vo(i,j),diro(i,j),&
                          raino(i,j),swo(i,j),po(i,j),Tdo(i,j)
        if(vo(i,j) <=0.)diro(i,j)=-999.
    end do
end do
10   continue

原則として、私は goto ステートメントを避けるようにしていますが、Fortran には、使用方法をまだ見つけていない構造がいくつかあります。

于 2015-06-18T14:57:58.787 に答える