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 FILE可能来自 IBM OS/360 的 FORTRAN 编译器,并且与操作系统 JCL 有关。可能还有其他实现,但是现代操作系统上不需要(也很少实用程序)来指定文件中未来的记录数和记录大小。有关详细信息,请参阅

初始化维度(非标准语言扩展)可以更改为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。当供应商试图通过提供方便的扩展来竞争时,这在 FORTRAN 77 之前很常见。这也是一个锁定陷阱,但当时人们对此不太敏感。我认为你最好通过推断这些东西应该做什么来将你的代码翻译成符合标准的。这取决于您有多少行,这将是多么困难。有一些代码转换产品(例如 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 编译器或相关的 - oof,那是旧的)。您似乎想要转换

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 回答