Fortran中的数据语句出错

时间:2016-04-18 04:45:26

标签: fortran syntax-error

我正在尝试编译的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)

有人知道如何使代码正常工作吗?

1 个答案:

答案 0 :(得分:0)

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

通过在data行之后的每一行使用延续标记,您可以使编译器将整个data语句作为单行处理为结束斜杠。您的延续仅继续数据内的表达式。 (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变量命名也不是一个好主意。