Fortran编译器支持哪些功能?

时间:2011-07-20 19:07:17

标签: gcc compiler-construction fortran gfortran

我有一些遗留代码我正在尝试编译,而且我的可用编译器很窒息。以下是导致问题的原因:

第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。这些线如何工作?我希望它们是格式化标志,但我没有在任何地方看到它。

3 个答案:

答案 0 :(得分:3)

DEFINE FILE可能来自IBM OS / 360的FORTRAN编译器,并且与操作系统JCL有关。可能还有其他实现,但是现代o / s不需要(并且很少实用)来指定文件中的未来记录数和记录大小。有关详细信息,请参阅this

初始化维度(非标准语言扩展名)可以更改为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)

答案 1 :(得分:2)

我认为这些都是非标准的Fortran。当供应商试图通过提供方便的扩展来竞争时,这在FORTRAN 77中非常普遍。它也是一个锁定陷阱,但当时人们不那么敏感。我认为通过推断这些东西应该做的事情,你最好将代码翻译成标准兼容。这取决于你有多少行有多难。有一些代码转换产品(例如,SPAG,http://www.polyhedron.com/spagqa0html) - 我不知道他们是否会理解这些扩展。

答案 2 :(得分: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 ]

define的东西有点模糊(并且可能将编译器识别为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说明符(谷歌用Google搜索就像你想的那样有用)。也许我对DEC错了。您能举例说明格式1905的使用方式吗?