我正在尝试在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
错误中引用的行是代码段的第四行。谁知道我的问题是什么?我知道这是非常古老的代码,但我在科学应用程序中继承了它,并且需要使它工作。
答案 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
,逗号和空白) - 可能用于构建更大的格式说明符。
如果我必须维护它,那么至少将代码带入耀斑和奇怪颜色的时代将是我的优先事项清单。