Arrays 释放后的数组大小

Arrays 释放后的数组大小,arrays,fortran,size,Arrays,Fortran,Size,我已经创建了一个可分配数组。我分配元素,然后打印数组的大小。我觉得奇怪的是,在解除分配后,规模仍然保持不变 Integer, Allocatable :: fred(:) Allocate (fred(3)) Write (*,*) "fred: ", Size (fred) Deallocate (fred) Write (*,*) "fred: ", Size (fred) 这是一个迫切需要规范的问题,真的。为了在缺席的情况下回答您的具体问题(据我所知,但我最终可能会写

我已经创建了一个可分配数组。我分配元素,然后打印数组的大小。我觉得奇怪的是,在解除分配后,规模仍然保持不变

  Integer, Allocatable :: fred(:)
  Allocate (fred(3))
  Write (*,*) "fred: ", Size (fred)
  Deallocate (fred)
  Write (*,*) "fred: ", Size (fred)

这是一个迫切需要规范的问题,真的。为了在缺席的情况下回答您的具体问题(据我所知,但我最终可能会写一个),我会回答

size
的参数不能是未分配的可分配变量

对于您的代码,
fred
是一个可分配变量。如果执行此代码块,则在最后一行
size
上有一个参数,它是一个未分配的可分配变量。在这种情况下,如果它构成程序(程序单元)的一部分,则该程序(程序单元)不是标准一致性程序(程序单元)

这种不一致性并不是要求Fortran处理器检测为一致性Fortran处理器的不一致性

是的,处理器检测到这一点会很好,如果您在编译时选择适当的选项,许多处理器会检测到这一点。按照流行的说法,一个符合标准的处理器将被允许启动第三次世界大战以响应此代码。它也可以打印
3
。这完全取决于编译器供应商的突发奇想

在评论提示下,提供更多信息

也许,期望释放数组的大小为零是很诱人的。但是,释放数组和元素为零的数组是完全不同的,因为长度为零的字符与未分配的可分配字符不同

特别是,我们有这样的成语

fred = [fred, append]
当未分配fred时无效,但当已分配但大小为零时有效;在后一种情况下,它不需要特殊处理

我同意High Performance Mark的评论,即如果编译器要返回任何值,
0
是一个错误的选择。虽然大小没有很好的定义,但是基于返回的大小来访问fred(3)也是一个坏主意。同样,编译器可以自由地为此引用提供任何特定值

最后,如果要检查是否分配了数组,则应使用
allocated
内部变量,而不是依赖
size
返回
0
。当然,在这种情况下不需要它,因为您可以非常确定在
deallocate
语句之后
fred
确实没有分配

在Fortran 90中,分配状态可能是未定义的,甚至不允许
分配


同样的想法也适用于数组和
大小
固有值以外的事物
size
是一个查询函数,它要求分配要查询的数组(如果是可分配的实体)或关联的指针(如果是指针)。同样,例如,具有延迟长度的字符必须分配/指针关联(如适用)作为
len
内在查询函数的参数


查询函数并不总是要求分配/关联参数。例如,即使未分配变量,也可能会询问显式长度字符的长度。人们应该检查文档中的要求,不要进行不允许的查询。

这是一个需要规范的问题,真的。为了在缺席的情况下回答您的具体问题(据我所知,但我最终可能会写一个),我会回答

size
的参数不能是未分配的可分配变量

对于您的代码,
fred
是一个可分配变量。如果执行此代码块,则在最后一行
size
上有一个参数,它是一个未分配的可分配变量。在这种情况下,如果它构成程序(程序单元)的一部分,则该程序(程序单元)不是标准一致性程序(程序单元)

这种不一致性并不是要求Fortran处理器检测为一致性Fortran处理器的不一致性

是的,处理器检测到这一点会很好,如果您在编译时选择适当的选项,许多处理器会检测到这一点。按照流行的说法,一个符合标准的处理器将被允许启动第三次世界大战以响应此代码。它也可以打印
3
。这完全取决于编译器供应商的突发奇想

在评论提示下,提供更多信息

也许,期望释放数组的大小为零是很诱人的。但是,释放数组和元素为零的数组是完全不同的,因为长度为零的字符与未分配的可分配字符不同

特别是,我们有这样的成语

fred = [fred, append]
当未分配fred
时无效,但当已分配但大小为零时有效;在后一种情况下,它不需要特殊处理

我同意High Performance Mark的评论,即如果编译器要返回任何值,
0
是一个错误的选择。虽然大小没有很好的定义,但是基于返回的大小来访问fred(3)
也是一个坏主意。同样,编译器可以自由地为此引用提供任何特定值

最后,如果要检查是否分配了数组,则应使用
allocated
内部变量,而不是依赖
size
返回
0
。当然,在这种情况下不需要它,因为您可以非常确定在
deallocate
语句之后
fred
确实没有分配

在Fortran 90中,分配状态可能是未定义的,甚至不允许
分配


同样的想法也适用于数组和