Fortran:两行以上的FORMAT语句

时间:2014-04-03 12:06:38

标签: format fortran line continuation

我有一个旧的Fortran 77代码,我想在F90-Compiler中运行,我的目标是尽可能少地更改代码。它工作得很好,但我在代码中的格式语句有一些问题。我不明白这是什么问题。我使用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)位于右括号后的第三行。

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

那里有什么问题?

2 个答案:

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

答案 1 :(得分: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应该作为编辑描述符吗?

旧版软件中的原始代码是什么?

nH Hollerith描述符只输出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