1

コンパイルしようとしているレガシー コードがあり、使用可能なコンパイラが詰まることがあります。問題の原因となっている行は次のとおりです。

5行目:

DIMENSION MMO(12)/31,28,31,30,31,30,31,31,30,31,30,31/

7、8行目:

DEFINE FILE 4(ANSI,FB,140,3360,0)
DEFINE FILE 7(SDF, ,42,42)

119行目:

1905 FORMAT(J2,J4,J2,29I5)

Lahey-Fujistu 95 言います:

1116-S: "fz32.f", line 5, column 24: Comma expected.
1110-S: "fz32.f", line 5, column 28: Missing name.
1336-S: "fz32.f", line 7, column 7: DEFINE FILE statement not supported.
1336-S: "fz32.f", line 8, column 7: DEFINE FILE statement not supported.
1511-S: "fz32.f", line 119: Invalid character string 'J' found in format specification.
1515-S: "fz32.f", line 119: Edit descriptor must be specified after the repeat specification in a format specification.

...さらに名前の欠落エラー

gfortran 77 言います:

fz32.f:5:
         DIMENSION MMO(12)/31,28,31,30,31,30,31,31,30,31,30,31/
                          ^
Invalid form for DIMENSION statement at (^)
fz32.f:7:
         DEFINE FILE 4(ANSI,FB,140,3360,0)
         1                     2
Unrecognized statement name at (1) and invalid form for assignment or statement-function definition at (2)
fz32.f:8:
         DEFINE FILE 7(SDF, ,42,42)
         1                  2
Unrecognized statement name at (1) and invalid form for assignment or statement-function definition at (2)
fz32.f:119:
    1905 FORMAT(J2,J4,J2,29I5)
                ^
Unrecognized FORMAT specifier at (^)
fz32.f:119:
    1905 FORMAT(J2,J4,J2,29I5)
                   ^
Unrecognized FORMAT specifier at (^)
fz32.f:119:
    1905 FORMAT(J2,J4,J2,29I5)
                      ^
Unrecognized FORMAT specifier at (^)

gcc は同様のエラーで失敗します。

では、このコードを作成するためにどのコンパイラを使用できたか知っている人はいますか?

また、7 行目と 8 行目では、ANSI と SDF がコードの前半で定義されていません。これらの行はどのように機能しますか? 私はそれらがフラグをフォーマットすることを期待していますが、どこにも文書化されていません。

4

3 に答える 3

3

DEFINE FILEIBM OS/360 の FORTRAN コンパイラに由来する可能性が高く、オペレーティング システムの JCL に関連しています。おそらく他の実装もありますが、最新の o/s では、ファイル内の将来のレコード数とレコード サイズを指定する必要はありません (そしてユーティリティはほとんどありません)。詳しくはこちらをご覧ください。

初期化された次元 (非標準の言語拡張) は、次のdataステートメントに変更できます。

DIMENSION MMO(12)
DATA MMO/31,28,31,30,31,30,31,31,30,31,30,31/

以前にフォーマットコードに出くわしたことを漠然と覚えていJますが、それが何を意味するのか思い出せません。コンテキストを考慮して、それらを次のように変更し、Iそれが機能するかどうかを確認できます。

1905 FORMAT(I2,I4,I2,29I5)
于 2011-07-20T21:05:17.700 に答える
2

これらはすべて非標準のFortranだと思います。これは、ベンダーが便利な拡張機能を提供して競争しようとしたFORTRAN77まではかなり一般的でした。それはロックイントラップでもありましたが、当時の人々はそれに対してあまり敏感ではありませんでした。このようなものが何をすることになっているのかを推測することによって、コードを標準に準拠したものに変換したほうがよいと思います。それはあなたがどれだけ難しいかによってあなたが持っている行の数に依存します。いくつかのコード変換製品があります(たとえば、SPAG、http: //www.polyhedron.com/spagqa0html )-これらの拡張機能を理解できるかどうかはわかりません。

于 2011-07-20T20:29:16.590 に答える
1

これです:

DIMENSION MMO(12)/31,28,31,30,31,30,31,31,30,31,30,31/

は、データ ステートメントの非標準バージョンにすぎません。F77でできること

  DIMENSION MMO(12)
  DATA MMO /31,28,31,30,31,30,31,31,30,31,30,31/

または現代のfortranであなたができる

  integer, dimension(12) ::  mmo = [31,28,31,30,31,30,31,31,30,31,30,31 ]

定義のものはもう少しあいまいです (そしておそらく、コンパイラを DEC コンパイラまたは関連するものとして識別します -- うーん、それは古いです)。変換したいようです

DEFINE FILE 4(ANSI,FB,140,3360,0)
DEFINE FILE 7(SDF, ,42,42)

のようなものに

OPEN(unit=4, access='direct', reclen=FB)
OPEN(unit=7, access='direct')

そしてそれがどうなるか見てください。

J 指定子はどこにも見つかりません (そして、J のグーグル検索は、あなたが思っているほど役に立ちます)。だから多分私はDECについて間違っています。フォーマット 1905 の使用例を教えてください。

于 2011-07-20T21:10:25.903 に答える