Fortran:错误#6562:数据initialization-expr对此对象无效

Mil*_*ila 7 fortran initialization

我试图将Fortran子例程中的本地逻辑数组初始化为false,但是我收到错误:

错误#6562:数据initialization-expr对此对象无效.

这里是我的报关表:

  integer                      , intent(in)    :: nLOW 
  integer                      , intent(in)    :: nUP
  logical , dimension(nLOW:nUP)                :: leastSQUARE =  .false.
Run Code Online (Sandbox Code Playgroud)

如果我使用,我会得到同样的错误:

  integer                                      :: I
  integer                      , intent(in)    :: nLOW 
  integer                      , intent(in)    :: nUP
  logical , dimension(nLOW:nUP)                :: leastSQUARE =  (/ (.false., I = nLOW:nUP) /)
Run Code Online (Sandbox Code Playgroud)

如果我写:

  integer                      , intent(in)    :: nLOW 
  integer                      , intent(in)    :: nUP
  logical , dimension(1:100)               :: leastSQUARE =   .false.
Run Code Online (Sandbox Code Playgroud)

子程序编译为零错误.知道为什么会这样吗?我显然需要leastSQUARE尺寸nLOW:nUP,所以后者不是一种解决方法.

Hig*_*ark 9

我认为语言标准禁止错误生成结构,特别是(在Fortran 2008版本中)C506在R503上.这种约束表明了

如果object-name是伪参数,函数结果,命名公共块中的对象,除非类型声明在块数据程序单元中,空白公共对象,可分配变量或自动对象,则不应出现初始化宾语.

leastSQUARE就是这样一个自动对象,其边界只在运行时才知道.您必须将其与声明分开初始化.

为了清楚(感谢@IanH),您必须执行赋值语句以为自动对象提供初始值.我在前一段中对动词初始化的使用不是Fortran标准.

  • 从Fortran术语的角度来看,初始化发生在哪里(源代码明智)并不重要 - 它根本无法初始化.如果OP希望数组在过程的执行序列的早期具有特定值,则它们需要使用赋值语句或类似方法为该数组赋予该值.初始化意味着SAVE,SAVE与自动对象不一致(当其值的基本特征因呼叫而异时,某些东西不能保留其值(... SAVE ...)). (2认同)