旧版 Fortran:Hollerith 编辑 Format 语句的描述符语法
Old fortran: Hollerith edit descriptor syntax for Format statement
我正在尝试对旧代码进行现代化改造(或至少使其更易于理解),但我已将 运行 转换为一种奇怪的格式,呃,FORMAT
语句。
具体来说,它是一个包含 Hollerith 常量的 FORMAT
语句(nH
,其中 n
是一个数字):
FORMAT(15H ((C(I,J),J=1,I3,12H),(D(J),J=1,I3, 6H),I=1,I3,') te'
1,'xt' )
这会扰乱语法高亮显示,因为它似乎有未闭合的括号。它可以按原样使用此格式语句进行编译,但关闭括号会导致编译错误(使用 intel 或 gfortran 编译器)。
据我了解,Hollerith 常量是 Fortran 66 的产物,并被 Fortran 77 中 CHARACTER
的出现所取代。我通常将它们用作字符之类的东西时理解它们,但用作FORMAT
让我很困惑。
此外,如果我将 15H ((...
更改为 15H ((...
(即我删除一个 space),它将无法编译。事实上,即使我把代码改成这样,它也不会编译:
FORMAT(15H ((C(I,J),J=1,I3,12H),(D(J),J=1,I3, 6H),I=1,I3,') text' )
我希望它采用更正常的 (F77+) 格式。感谢您的帮助。
你拥有的实际上是 Hollerith edit descriptors,而不是 constants(这会出现在 DATA 或 CALL 语句中),尽管它们使用相同的语法。 F77 完全取代了 Hollerith 常数;它添加了字符文字编辑描述符作为(好得多!)更好的选择,但是 H 编辑描述符在 F95 之前一直保留在标准中(即使在那时一些编译器仍然接受它作为兼容性功能)。
在任何情况下,H
之前的数字采用 H
之后的字符数,没有任何其他分隔符;这就是为什么在 H
之后删除(或添加)一个字符会搞砸的原因。解析您的格式会将其分成这些部分
15H ((C(I,J),J=1,
I3,
12H),(D(J),J=1,
I3,
6H),I=1,
I3,
') te'
'xt'
因此现代的等价物(为清楚起见带有可选空格)是
nn FORMAT( ' ((C(I,J),J=1,', I3, '),(D(J),J=1,', I3, '),I=1,', I3
1,') text' )
或者,如果您愿意,可以将该文本放在继续(包括括号)之后的字符值、变量或参数中,用于 I/O 语句而不是 FORMAT 标签,但是由于您必须加倍所有引号字符以将它们置于不太方便的 CHARACTER 值中。
您的全联机版本可能没有编译,因为您使用的是固定格式,可能是默认情况下,固定格式只接受每个源代码行的前 72 个字符,其中前 6 个保留用于语句编号和继续指示符,只剩下 66 个,根据我的统计,该语句为 71 个。实际上,今天您会发现的任何编译器也接受自由格式,它允许更长的行并且对于新代码也有其他优势,但可能需要更改现有代码,有时需要进行大量更改。
我正在尝试对旧代码进行现代化改造(或至少使其更易于理解),但我已将 运行 转换为一种奇怪的格式,呃,FORMAT
语句。
具体来说,它是一个包含 Hollerith 常量的 FORMAT
语句(nH
,其中 n
是一个数字):
FORMAT(15H ((C(I,J),J=1,I3,12H),(D(J),J=1,I3, 6H),I=1,I3,') te'
1,'xt' )
这会扰乱语法高亮显示,因为它似乎有未闭合的括号。它可以按原样使用此格式语句进行编译,但关闭括号会导致编译错误(使用 intel 或 gfortran 编译器)。
据我了解,Hollerith 常量是 Fortran 66 的产物,并被 Fortran 77 中 CHARACTER
的出现所取代。我通常将它们用作字符之类的东西时理解它们,但用作FORMAT
让我很困惑。
此外,如果我将 15H ((...
更改为 15H ((...
(即我删除一个 space),它将无法编译。事实上,即使我把代码改成这样,它也不会编译:
FORMAT(15H ((C(I,J),J=1,I3,12H),(D(J),J=1,I3, 6H),I=1,I3,') text' )
我希望它采用更正常的 (F77+) 格式。感谢您的帮助。
你拥有的实际上是 Hollerith edit descriptors,而不是 constants(这会出现在 DATA 或 CALL 语句中),尽管它们使用相同的语法。 F77 完全取代了 Hollerith 常数;它添加了字符文字编辑描述符作为(好得多!)更好的选择,但是 H 编辑描述符在 F95 之前一直保留在标准中(即使在那时一些编译器仍然接受它作为兼容性功能)。
在任何情况下,H
之前的数字采用 H
之后的字符数,没有任何其他分隔符;这就是为什么在 H
之后删除(或添加)一个字符会搞砸的原因。解析您的格式会将其分成这些部分
15H ((C(I,J),J=1,
I3,
12H),(D(J),J=1,
I3,
6H),I=1,
I3,
') te'
'xt'
因此现代的等价物(为清楚起见带有可选空格)是
nn FORMAT( ' ((C(I,J),J=1,', I3, '),(D(J),J=1,', I3, '),I=1,', I3
1,') text' )
或者,如果您愿意,可以将该文本放在继续(包括括号)之后的字符值、变量或参数中,用于 I/O 语句而不是 FORMAT 标签,但是由于您必须加倍所有引号字符以将它们置于不太方便的 CHARACTER 值中。
您的全联机版本可能没有编译,因为您使用的是固定格式,可能是默认情况下,固定格式只接受每个源代码行的前 72 个字符,其中前 6 个保留用于语句编号和继续指示符,只剩下 66 个,根据我的统计,该语句为 71 个。实际上,今天您会发现的任何编译器也接受自由格式,它允许更长的行并且对于新代码也有其他优势,但可能需要更改现有代码,有时需要进行大量更改。