Fortran中的数据语句出错



我试图编译的Fortran项目中的一部分代码是

  implicit double precision (a-h,o-z)
  dimension fact(1:5)
  data fact / 
  d660p=rpt1*dp(6,beta2,rpt1)*d3(0,6,0,beta2,rpt1,rpt2,rpt3)
 1     +rpt2*dp(6,beta2,rpt2)*d3(6,0,0,beta2,rpt1,rpt2,rpt3)
  d606p=rpt1*dp(6,beta2,rpt1)*d3(0,0,6,beta2,rpt1,rpt2,rpt3)
 1     +rpt3*dp(6,beta2,rpt3)*d3(6,0,0,beta2,rpt1,rpt2,rpt3)
  d066p=rpt2*dp(6,beta2,rpt2)*d3(0,0,6,beta2,rpt1,rpt2,rpt3)
 1     +rpt3*dp(6,beta2,rpt3)*d3(0,6,0,beta2,rpt1,rpt2,rpt3)
  d633p=rpt1*dp(6,beta3,rpt1)*d3(0,3,3,beta3,rpt1,rpt2,rpt3)
 1     +rpt2*dp(3,beta3,rpt2)*d3(6,0,3,beta3,rpt1,rpt2,rpt3)
 1     +rpt3*dp(3,beta3,rpt3)*d3(6,3,0,beta3,rpt1,rpt2,rpt3)
  d363p=rpt1*dp(3,beta3,rpt1)*d3(0,6,3,beta3,rpt1,rpt2,rpt3)
 1     +rpt2*dp(6,beta3,rpt2)*d3(3,0,3,beta3,rpt1,rpt2,rpt3)
 1     +rpt3*dp(3,beta3,rpt3)*d3(3,6,0,beta3,rpt1,rpt2,rpt3)
  d336p=rpt1*dp(3,beta3,rpt1)*d3(0,3,6,beta3,rpt1,rpt2,rpt3)
 1     +rpt2*dp(3,beta3,rpt2)*d3(3,0,6,beta3,rpt1,rpt2,rpt3)
 1     +rpt3*dp(6,beta3,rpt3)*d3(3,3,0,beta3,rpt1,rpt2,rpt3)/

但是,编译会生成以下错误

mc.f(2003): error #5082: Syntax error, found END-OF-STATEMENT when expecting one of: ( <IDENTIFIER> <CHAR_CON_KIND_PARAM> <CHAR_NAM_KIND_PARAM> <CHARACTER_CONSTANT> <INTEGER_CONSTANT> ...
  data fact /
------------------^
mc.f(2018): error #5082: Syntax error, found END-OF-STATEMENT when expecting one of: ( <IDENTIFIER> <CHAR_CON_KIND_PARAM> <CHAR_NAM_KIND_PARAM> <CHARACTER_CONSTANT> <INTEGER_CONSTANT> ...
 1     +rpt3*dp(8,beta8,rpt3)*d3(0,6,0,beta8,rpt1,rpt2,rpt3) /
------------------------------------------------------------------^
compilation aborted for mc.f (code 1)

有人知道如何让代码工作吗?

您得到的语法错误是因为data fact /单独在一行上,在开头斜杠之后没有任何内容。编译器需要一个常量或参数名称,告诉您是这样。按原样,data语句是不完整的。(感谢High Performance Mark指出这一点。我在之前的回答中错过了这一点)

您可以通过在data行之后的每一行上使用连续标记,使编译器将整个data语句(直到结束斜杠)视为一行。您的continuation只继续数据中的表达式。(data中的项目应该用逗号分隔。)

不过,修复延续和逗号不会使代码编译。

data语句在程序启动时初始化变量。因此,斜线之间的数字必须是常量或命名为parameters。不能使用表达式,甚至不能对常量使用表达式。(表达式3*0.0data中有特殊含义;它的意思是零值的三倍,即0.0, 0.0, 0.0。)

如果你想初始化你的数组,请使用赋值,它将根据变量的当前值计算条目:

  fact(1) = rpt1*dp(6,beta2,rpt1)*d3(0,6,0,beta2,rpt1,rpt2,rpt3)
 1        + rpt2*dp(6,beta2,rpt2)*d3(6,0,0,beta2,rpt1,rpt2,rpt3)

或者,如果您还需要中间变量:

  d660p = rpt1*dp(6,beta2,rpt1)*d3(0,6,0,beta2,rpt1,rpt2,rpt3)
 1        + rpt2*dp(6,beta2,rpt2)*d3(6,0,0,beta2,rpt1,rpt2,rpt3)
  fact(1) = d660p

顺便说一下,您的数组有五个条目,但您正在尝试初始化六个条目。implicit变量命名也不是一个好主意。

最新更新