释放后数组的大小

Size of array after a deallocate

我创建了一个可分配数组。我分配元素,然后打印数组的大小。我发现在解除分配后大小保持不变很奇怪。

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

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

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

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

这种不符合性并不是 Fortran 处理器需要检测才能成为符合要求的 Fortran 处理器的不符合性。

是的,处理器检测到这一点会很好,如果您在编译时选择适当的选项,很多处理器都会检测到。按照流行的说法,符合标准的处理器将被允许启动 World War III 以响应此代码。它还可能打印 3。这完全取决于编译器供应商的心血来潮。

评论提示,更多信息。

解除分配的数组的大小可能为零,这很诱人。但是,已解除分配的数组和包含零个元素的数组是完全不同的东西,就像长度为零的字符与未分配的可分配字符不同一样。

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

fred = [fred, append]

fred 未分配时无效,但在分配但大小为零时有效;在后一种情况下不需要特殊处理。

我同意 High Performance Mark 的评论,如果编译器要 return 任何值,0 是一个糟糕的选择。由于大小没有很好地定义,任何尝试访问 fred(3),例如,基于 returned 大小,也是一个坏主意。同样,编译器可以自由地为此引用提供任何特定值。

最后,如果你想检查一个数组是否被分配,你应该使用 allocated 内在函数而不是依赖 size returning 0。当然,在这种情况下不需要它,因为您可以非常确定在 deallocate 语句之后 fred 确实没有分配。

在 Fortran 90 中,分配状态可能未定义,甚至 allocated 也不被允许。


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

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