在(1)的表达中期望右括号

时间:2013-02-28 03:45:26

标签: fortran gfortran

我正在尝试在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

错误中引用的行是代码段的第四行。谁知道我的问题是什么?我知道这是非常古老的代码,但我在科学应用程序中继承了它,并且需要使它工作。

2 个答案:

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

答案 1 :(得分:2)

1H事物被称为Fortran 66时代的Hollerith常数,其中1表示常量在源代码字符方面的长度,然后常量的实际值是编码形式H之后的字符数(包括空格)。众所周知,它们容易出错。

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

也就是说,在调整了前导固定格式源列的丢失后,您的代码将使用最新版本的gfortran进行编译。使用霍勒瑞斯常数 - 尽管如此,它只需要一个空白 - 并且事情可能会严重破坏。

(具有讽刺意味的是,使用固定形式的源码,您通常可以通过故意放弃来分散空白 - 使这两种语言功能的交集相当特殊......)

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

如果我必须维护它,那么至少将代码带入耀斑和奇怪颜色的时代将是我的优先事项清单。