如何解决数据语句中的语法错误?

时间:2015-12-14 09:48:14

标签: fortran

嗨,我是新来的,想要解决这个问题:

do k=1,31
    Data H(1,k)/0/
End do

do l=1,21
   Data H(l,1)/0.5*(l-1)/
End do

do m=31,41
   Data H(17,m)/0/
End do

do n=17,21
   Data H(n,41)/0.5*(n-17)/
End do

我得到l和n的错误,说它是DATA语句中的语法错误。有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

这里有三个问题,而不只是" l"和" n"环路。

第一个问题是data语句中的值不能是任意表达式。特别是,它们必须是常数; 0.5*(l-1)不是常数。

第二个问题是对象列表中的边界也必须是常量(表达式); l不是一个常数表达式。

对于第一个,还值得注意的是数据值列表中的*具有特殊含义,并且它不是乘法运算符。 *提供重复计数,重复计数0.5无效。

通过使用

这样的结构,您可以非常简单地修复第二点
data H(1,1:31) /31*0./  ! Note the repeat count specifier

在循环外部,或使用隐含循环

data (H(1,k),k=1,31) /31*0./

为" l"做些事情。循环更乏味

data H(1:21,1) /0., 0.5, 1., 1.5, ... /

我们必须非常小心指定的值的数量。这不可能是动态的。

第三个问题是您不能多次为元素指定显式初始化。看看你的前两个循环:如果这有效,你就要初始化H(1,1)两次。即使给出相同的值,这仍然无效。

嗯,实际上你有四个问题。第四个与关于动态数值的关系有关。您可能不想进行显式初始化。虽然可以做你想做的事情,但只要使用这些限制不适用的作业。

do l=1,21
   H(l,1) = 0.5*(l-1)
End do

是的,有时复杂的显式初始化是理想的事情,但在这种情况下,我假设是新代码,保持简单是好的。 "初始化"执行作业的代码部分远远超过"现代"。