Initialization Fortran:错误#6562:数据初始化表达式对此对象无效

Initialization Fortran:错误#6562:数据初始化表达式对此对象无效,initialization,fortran,Initialization,Fortran,我试图将Fortran子例程中的本地逻辑数组初始化为false,但出现错误: 错误#6562:数据初始化表达式对此对象无效 这是我的声明: integer , intent(in) :: nLOW integer , intent(in) :: nUP logical , dimension(nLOW:nUP) :: leastSQUARE = .fals

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

错误#6562:数据初始化表达式对此对象无效

这是我的声明:

  integer                      , intent(in)    :: nLOW 
  integer                      , intent(in)    :: nUP
  logical , dimension(nLOW:nUP)                :: leastSQUARE =  .false.
如果我使用以下命令,则会出现相同的错误:

  integer                                      :: I
  integer                      , intent(in)    :: nLOW 
  integer                      , intent(in)    :: nUP
  logical , dimension(nLOW:nUP)                :: leastSQUARE =  (/ (.false., I = nLOW:nUP) /)
如果我写:

  integer                      , intent(in)    :: nLOW 
  integer                      , intent(in)    :: nUP
  logical , dimension(1:100)               :: leastSQUARE =   .false.

子例程编译时没有错误。知道为什么会这样吗?我显然需要
leastSQUARE
的尺寸
nLOW:nUP
,因此后者不是一个解决办法。

我认为语言标准禁止生成错误的构造,特别是R503上的C506(在Fortran 2008版本中)。这一约束规定

如果对象名称是伪参数,则不应出现初始化, 函数结果,命名公共块中的对象,除非类型 声明位于块数据程序单元中,对象为空 公共、可分配变量或自动对象

leastSQUARE
就是这样一个自动对象,其边界只有在运行时才知道。您必须在声明中单独对其进行初始化


为了清楚(多亏了@IanH),您必须执行赋值语句来为自动对象提供初始值。我在上一段中使用的动词initialise不是Fortran标准。

从Fortran术语的角度来看,初始化发生在哪里(源代码方面)无关紧要—它根本无法初始化。如果OP希望数组在过程的执行序列的早期具有特定值,那么他们需要使用赋值语句或类似语句为数组提供该值。初始化意味着保存,保存与自动对象不一致(当其值的基本特征因调用而异时,某些对象无法保留其值(…保存…)。