2

我正在尝试在 gfortran 中编译以下代码:

  INTEGER F(10),G(14),LUN(5)
  DIMENSION MESSG(NMESSG) 
  DATA F(1),F(2),F(3),F(4),F(5),F(6),F(7),F(8),F(9),F(10) 
 1   / 1H( ,1H1 ,1HX ,1H, ,1H  ,1H  ,1HA ,1H  ,1H  ,1H) / 
  DATA G(1),G(2),G(3),G(4),G(5),G(6),G(7),G(8),G(9),G(10) 
 1   / 1H( ,1H1 ,1HX ,1H  ,1H  ,1H  ,1H  ,1H  ,1H  ,1H  / 
  DATA G(11),G(12),G(13),G(14)
 1   / 1H   ,1H   ,1H   ,1H)  / 
  DATA LA/1HA/,LCOM/1H,/,LBLANK/1H / 

我收到以下错误:

错误:在 (1) 处的表达式中应有右括号:

 1   / 1H( ,1H1 ,1HX ,1H, ,1H  ,1H  ,1HA ,1H  ,1H  ,1H) /           
                                                      1

错误中引用的行是代码片段的第四行。有谁知道我的问题是什么?我知道这确实是旧代码,但我在科学应用程序中继承了它,需要让它工作。

4

2 回答 2

4

您的旧代码使用 Hollerith H 将字符值放入整数变量中。更现代的 Fortran 可能是:

character*10 F
DATA  F / "(1X,  A  )" /

更现代:

character (len=10) :: F = "(1X,  A  )"

但这些正在改变 F 的类型,这将影响其余代码。因此,使用这些更改将需要其他重写,但如果它是我的代码,我会考虑它,考虑到问题代码部分的陈旧和不可读性。如果工作量太大,我可以使用 gfortran 编译以下内容:

  program f2
  INTEGER F(10),G(14),LUN(5)
  DATA F(1),F(2),F(3),F(4),F(5),F(6),F(7),F(8),F(9),F(10)
 $  / 1H( ,1H1 ,1HX ,1H, ,1H  ,1H  ,1HA ,1H  ,1H  ,1H) /
  DATA G(1),G(2),G(3),G(4),G(5),G(6),G(7),G(8),G(9),G(10), G(11),G(12),G(13),G(14)
 $  / 1H( ,1H1 ,1HX ,1H  ,1H  ,1H  ,1H  ,1H  ,1H  ,1H   ,1H   ,1H   ,1H   ,1H)  /
  DATA LA/1HA/,LCOM/1H,/,LBLANK/1H /
  end

gfortran-mp-4.7  -O3  -ffixed-form  -ffixed-line-length-none  -std=legacy f2.f
于 2013-02-28T04:03:08.800 回答
2

这些1H东西被称为 Fortran 66 时代的 Hollerith 常量,其中 1 表示常量的源代码字符长度,然后常量的实际值是该字符数(包括空格)的编码形式H. 他们是出了名的容易出错。

您的代码使用固定格式的源代码。这也是出了名的容易出错。

也就是说,在调整了领先的固定格式源列的丢失之后,您的代码在此处使用最新版本的 gfortran 编译。使用 Hollerith 常量 - 所需要的只是一个空白位置 - 事情可能会严重破裂。

(具有讽刺意味的是,使用固定格式的源代码,您通常可以随意丢弃空白 - 使这两种语言功能的交集相当特别......)

就其价值而言,F 和 G 的编码数据看起来像简单的格式说明符。在“现代”Fortran 中(好吧,自 1977 年以来!)您只需使用字符变量来分别保存 F 和 G 的格式(1X,A)(1X)(省略空格)。其他变量看起来像简单的字符常量(A、逗号和空白) - 可能用于构建更大的格式说明符。

如果我必须维护它,至少将代码带入耀斑和奇怪颜色的时代将在我的优先事项列表中占据很高的位置。

于 2013-02-28T04:13:56.463 回答