2

Windows用の最新のIntelコンパイラ(Visual Studio内で実行)を使用して再コンパイルしているレガシーFortranコードがいくつかあります。悲しいことに、私のFortranスキルは少し錆びています。

この特定のコードは、配列を使用して、プログラムの実行中に発生する問題を記録します。この配列は次のように宣言されます。

CHARACTER FAIL(25)*(255)

これは、この配列をチェックし、'F'(つまり「失敗した」)で始まる要素が見つかった場合に何かを実行するコードです。

      DO 20 CNTERR = OERRNO,ERRNO
         IF (FAIL(CNTERR)(1:1).EQ.'F') GOTO 9999
   20 CONTINUE

ほとんどすべての場合OERRNOERRNOはゼロであるため、ゼロにCNTERRもなります。つまり、Fortranは1ベースの配列を使用しているため、存在しない要素を調べていると思います。

コードは、VS内のデフォルトの「リリース」構成を使用して問題なくコンパイルおよび実行されます。コンパイルされますが、デフォルトの「デバッグ」構成では実行できません。重要な違いは、「デバッグ」には「配列と文字列の境界のチェック」オプションが設定されていること/check:boundsです。

私の質問:「リリース」構成でビルドした場合、コードは正しく実行されているように見えます。しかし、私は私を噛むような深刻な悪いことをしていますか?範囲外の配列要素を要求すると、Fortranは何を返しますか?

4

1 に答える 1

4

私の質問:「リリース」構成でビルドした場合、コードは正しく実行されているように見えます。しかし、私は私を噛むような深刻な悪いことをしていますか?範囲外の配列要素を要求すると、FORTRANは何を返しますか?

あなたが正しいです。範囲外へのアクセスは常に間違っており、そうです、それは簡単にあなたを噛む可能性があります。Fortranが言うことについてはどうなるのでしょうか?まあ、それは単にあなたがそれをすることができないと言っているだけです、そしてそのような場合、実装は何もしないことから、有用なエラーメッセージを出力すること、そして3分の警告を鳴らすことまで、好きなことを何でもすることができます。

これを修正するには、さらにコードが必要ですが、OERRNOを1に初期化すると、ERRNO = 0の場合、ループが実行されないため、これでうまくいくと思います。

もう1つ:

CHARACTER FAIL(25)*(255)

私のF77は錆びており、F90のスタイルはここでは異なりますが、これが正しいかどうかはわかりません。私の失敗した記憶は示唆している

CHARACTER*255 FAIL(25)

代わりは。

于 2012-11-14T11:45:05.217 に答える