0

Fortran 2003標準でコンパイルしようとしている従来のFortran 77コードを継承しました。私は Fortran について何も知りません (C と Python は知っています)。途中で取り上げています。

以下のコード スニペットでは、コンパイラ エラーが発生します (以下も参照)。正直なところ、このコードを見るだけで頭が痛くなります。

A(i) = A(i) + B(q)

ここで、A と B はどちらも関数です。私は C と Python の再帰関数の概念に精通しており、ここに示されているこの状況で私がコンパイラーだったら、おそらく不平を言い、少なくともWTF警告を出すでしょう。

誰かがこのコードを修正してくれるとは思っていません。誰かが行によって達成される(試みられた)ことを私に説明できれば、私は幸せです:

cipr(IPR_WADV, ipa_idx, ispc) = cipr(IPR_WADV, ipa_idx, ispc) + fc1(l)/dy/depth(i,j,k)  

または、それを調べることができる適切な場所を紹介してください。

以下は、コード スニペットと対応するコンパイラ エラーです。

IF( lipr ) THEN
    !-----Change from X-direction horizontal advection
    l = 1
    DO i=i1+1,i2-1
        l = l+1
       IF( ipa_cel(i,j,k) .GT. 0 ) THEN
          ipa_idx = ipa_cel(i,j,k)
          !-----Flux at west boundary
          cipr(IPR_WADV, ipa_idx, ispc) = cipr(IPR_WADV, ipa_idx, ispc) + fc1(l)/dy/depth(i,j,k)          
          !-----Flux at east boundary
          cipr(IPR_EADV, ipa_idx, ispc) = cipr(IPR_EADV, ipa_idx, ispc) + fc2(l)/dy/depth(i,j,k)
          !-----Average volume
          cipr(IPR_VOL, ipa_idx, ispc) = cipr(IPR_VOL, ipa_idx, ispc) + dx(j)*dy*depth(i,j,k)
          npastep(ipa_idx,ispc) = npastep(ipa_idx,ispc) + 1
          END IF
    END DO
END IF

コンパイラは、この出力メッセージをエラーとして表示します

gfortran -std=f2003  -c -g -o build/Debug/GNU-Linux-x86/xyadvec.o
xyadvec.f03 xyadvec.f03:177.42:

cipr(IPR_WADV, ipa_idx, ispc) = cipr(IPR_WADV, ipa_idx, ispc) + fc1(l
                               1 
Error: Statement function at (1) is recursive
4

1 に答える 1

2

おそらくcipr配列であり、どういうわけかコンパイラはそれを知りません。その場合、その行はステートメント関数として解釈されます。

例えば、

program dummy
dimension c(10)
c(i) = c(i) + d
end program

これは配列と同様にコンパイルされます (ユニット化された変数の使用に関する警告に加えて)、c行は配列内の要素を更新しますc[i] += d。これは、C で行う場合と同様です。

c が配列でない場合、その行はマクロと同様に 1 行の関数として解釈されます。たとえば、次のようになります。

program dummy
c(i) = 2*i
...
myvar = c(2)
end program

ここで c は引数の 2 倍を返す関数なので、myvar4 になります。

したがって、あなたの場合、cipr配列であることを意図した使用法から推測し、の宣言ciprまたはの次元を宣言するいくつかのインクルードファイルに問題がありますcipr。コンパイラはそれをステートメント関数として解釈するため、失敗します。

この行が発生するファイル全体を教えてください。

于 2013-11-03T12:24:08.883 に答える