1

我有一个旧的 Fortran 77 代码,我想在 F90 编译器中运行它,我的目标是尽可能少地更改代码。它工作得很好,但我对代码中的格式语句有一些问题。而且我不明白有什么问题。我使用 Eclipse 和 gfortran。我使用自由形式。

问题 1

这编译得很好:

program HelloWorld
400   FORMAT(7HK GAMMA,2X,G13.5,7H P0,2X,G13.5,6H A1,2X,G13.5) 
end program

这不编译

program HelloWorld
400   FORMAT(7HK 'GAMMA',2X,G13.5,7H 'P0',2X,G13.5,6H 'A1',2X,G13.5)
                                       1
end program

错误是

P 描述符在 (1) 处的格式字符串中需要前导比例因子

(错误是从德语翻译过来的,可能与英语中的单词不完全相同)怎么了?

问题2

这也编译得很好:

program HelloWorld
400   FORMAT(7HK GAMMA,2X,G13.5,7H P0, &
      2X,G13.5,6H A1,2X,G13.5)
end program

如果我在最后一个代码中添加更多代码:

program HelloWorld
400   FORMAT(7HK GAMMA,2X,G13.5,7H P0,2X,G13.5,6H A1,2X,G13.5, &
      2X,7HK,ALPHA-1,2X,G13.5,7H  BETA-4,2X,G13.5 )
end program

它不再编译了。错误是:

P 在 (1) 处的格式字符串 * 中预期的编辑描述符

而 (1) 位于右括号之后的第三行。

*我不确定“格式字符串”的翻译,因为我的控制台是德语的。

那里有什么问题?

4

2 回答 2

5

您的格式语句有一个 H(代表 Hollerith)编辑描述符 - 格式语句中的内容有一个数字后跟一个H. 描述符导致 H 后面的字符(包括空格)并按输出到文件的前导数字计数。

此语言功能在 Fortran 90 中已过时,并从 Fortran 95 中完全删除。

他们容易出错。自 Fortran 77 以来,实现相同结果的更好方法是使用字符常量编辑描述符。

问题是您在前导数字指示的字符数与显然在描述符中的字符的实际计数之间存在(或正在创建)不匹配。例如,下面复制您的第二个 FORMAT 语句,显示描述符中的七个字符。您可以看到它是如何在“字符串”中间结束的。然后,这会混淆编译器对于格式规范的其余部分所看到的内容。

400   FORMAT(7HK 'GAMMA',2X,G13.5,7H 'P0',2X,G13.5,6H 'A1',2X,G13.5)
               1234567
于 2014-04-03T12:28:11.183 回答
0

正如我在评论中所写,它看起来更像 FORTRAN66 而不是 77,因为在H将数据类型引入语言之前使用了 Hollerith 描述符和数据类型CHARACTER。它还用于将字符数据分配给整数变量,但幸运的是这种情况很少见。然而,作为编辑描述符的使用更为普遍,尽管非常过时。

目前尚不清楚您想要实现什么,所需输出的良好示例会有所帮助。

你的意思是:

400   FORMAT(7HK GAMMA,2X,G13.5,3H P0,2X,G13.5,3H A1,2X,G13.5) 

以便

print 400, 1. ,2. ,3. 

输出

K GAMMA     1.0000     P0     2.0000     A1     3.0000

还是应该将 P0 和 A1 作为编辑描述符?

遗留软件中的原始代码是什么?

nHHollerith 描述符只输出下一个字符,n因此它可以无意中“吃掉”您的一些描述符并打印它们。

那是导致您的示例无法编译的问题,因为n前面H的内容太大,而其余的格式则没有意义。

下一个可能是

400   FORMAT(8H 'GAMMA',2X,G13.5,5H 'P0',2X,G13.5,5H 'A1',2X,G13.5)

打印

 'GAMMA'     1.0000     'P0'     2.0000     'A1'     3.0000

上述在Fortran 95及以上版本中的效果更好通过以下方式实现

print '(A0,2X,G13.5,A0,2X,G13.5,A0,2X,G13.5)', " 'GAMMA'",1.," 'P0'", 2.0, " 'A1'", 3.0

也许你宁愿只使用:

print '(A0,2X,G13.5,A0,2X,G13.5,A0,2X,G13.5)', "GAMMA",1.,"P0", 2.0, "A1", 3.0

用于印刷

GAMMA     1.0000     P0     2.0000     A1     3.0000

甚至

print *, "GAMMA",1.,"P0", 2.0, "A1", 3.0
于 2014-04-03T12:26:21.987 回答