我有一些遗留代码我正在尝试编译,而且我的可用编译器很窒息。以下是导致问题的原因:
第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。这些线如何工作?我希望它们是格式化标志,但我没有在任何地方看到它。
答案 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的使用方式吗?