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
ほとんどすべての場合OERRNO
、ERRNO
はゼロであるため、ゼロにCNTERR
もなります。つまり、Fortranは1ベースの配列を使用しているため、存在しない要素を調べていると思います。
コードは、VS内のデフォルトの「リリース」構成を使用して問題なくコンパイルおよび実行されます。コンパイルされますが、デフォルトの「デバッグ」構成では実行できません。重要な違いは、「デバッグ」には「配列と文字列の境界のチェック」オプションが設定されていること/check:bounds
です。
私の質問:「リリース」構成でビルドした場合、コードは正しく実行されているように見えます。しかし、私は私を噛むような深刻な悪いことをしていますか?範囲外の配列要素を要求すると、Fortranは何を返しますか?