我正在尝试对旧代码进行现代化(或者至少让它更容易理解)但是我已经遇到了一个奇怪的格式,对于一个呃,FORMAT语句.
具体来说,它是一个FORMAT带有Hollerith常量的声明(nHwhere n是一个数字):
FORMAT(15H ((C(I,J),J=1,I3,12H),(D(J),J=1,I3, 6H),I=1,I3,') te'
1,'xt' )
Run Code Online (Sandbox Code Playgroud)
这与语法突出显示混淆,因为它看起来有未闭括号.它使用这种格式语句编译得很好,但是关闭括号会导致编译错误(使用intel或gfortran编译器).
据我了解,Hollerith常量是Fortran 66的一个生物,并且被CHARACTERFortran 77中的出现所取代.我通常在用作类似角色的东西时理解它们,但是用作FORMAT混淆我.
此外,如果我15H ((...改为15H ((...(即我删除一个空格),它将无法编译.事实上,即使我将代码更改为此代码,它也无法编译:
FORMAT(15H ((C(I,J),J=1,I3,12H),(D(J),J=1,I3, 6H),I=1,I3,') text' )
Run Code Online (Sandbox Code Playgroud)
我希望这是一个更正常(F77 +)格式.任何帮助表示赞赏.
你拥有的实际上是Hollerith 编辑描述符,而不是常量(可能出现在DATA或CALL语句中),尽管它们使用相同的语法.F77彻底取代了霍勒瑞斯的常数; 它添加了char-literal编辑描述符作为(更多!)更好的替代方案,但是H编辑描述符保留在标准中直到F95(甚至一些编译器仍然接受它作为兼容性功能).
在任何情况下,之前的数字H取这个数字后的数字H,没有任何其他分隔符; 这就是为什么在搞砸之后删除(或添加)一个字符的原因H.解析您的格式将其分解为这些部分
15H ((C(I,J),J=1,
I3,
12H),(D(J),J=1,
I3,
6H),I=1,
I3,
') te'
'xt'
Run Code Online (Sandbox Code Playgroud)
因此,现代的等价物(为了清晰起见,可选的空间)是
nn FORMAT( ' ((C(I,J),J=1,', I3, '),(D(J),J=1,', I3, '),I=1,', I3
1,') text' )
Run Code Online (Sandbox Code Playgroud)
或者如果您愿意,可以在继续(包括parens)之后将该文本放在I/O语句中使用的CHARACTER值,变量或参数中,而不是FORMAT标签,但是因为必须将所有引号字符加倍才能得到它们在一个不太方便的CHARACTER值.
您的一线版本可能没有编译,因为您使用的是固定格式,可能默认情况下,并且只有固定格式的每个源行的前72个字符被接受,其中前6个是保留的对于声明编号和继续指示符,只留下66,并且该计数是71.实际上,您今天发现的任何编译器也接受自由格式,这允许更长的行并且对于新代码也具有其他优点,但可能需要对现有代码进行更改,有时需要进行大量更改.
| 归档时间: |
|
| 查看次数: |
268 次 |
| 最近记录: |