我创建了一个可分配的数组。我分配元素然后打印数组的大小。我发现奇怪的是,在解除分配后,大小保持不变。
Integer, Allocatable :: fred(:)
Allocate (fred(3))
Write (*,*) "fred: ", Size (fred)
Deallocate (fred)
Write (*,*) "fred: ", Size (fred)
答案 0 :(得分:10)
这是一个迫切需要一个规范的问题,真的。为了在没有的情况下回答你的具体问题(据我所知,但我最终可能会写一篇),我会回答。
size
的参数不能是未分配的可分配变量。
对于您的代码fred
是一个可分配的变量。如果执行了这个代码块,那么在最后一行size
上有一个参数,它是一个未分配的可分配变量。在这种情况下,如果它构成程序(程序单元)的一部分,那么该程序(程序单元)不是标准的符合程序(程序单元)。
缺乏一致性并不是缺乏一致性要求Fortran处理器检测到是符合标准的Fortran处理器。
是的,处理器检测到这一点会很好,如果你在编译时选择合适的选项,很多人会这么做。按照流行的说法,允许使用标准的符合标准的处理器来响应此代码开始第三次世界大战。它也可能会打印3
。这完全取决于编译器供应商的心血来潮。
评论提示,更多信息。
或许,假设解除分配的数组的大小为零,这很诱人。但是,解除分配的数组和具有零元素的数组是完全不同的东西,就像长度为零的字符与未分配的可分配字符不同。
特别是,我们有像
这样的习语fred = [fred, append]
在未分配fred
时无效,但在分配但大小为零时无效;在后一种情况下,它不需要特殊处理。
我同意High Performance Mark的评论,如果编译器要返回任何值,0
是一个糟糕的选择。尽管规模尚未明确定义,但根据返回的大小访问fred(3)
的任何尝试都是一个坏主意。同样,编译器可以自由地为此引用提供任何特定值。
最后,如果要检查是否已分配数组,则应使用allocated
内在函数,而不是依赖size
返回0
。当然,在这种情况下,它是不需要的,因为您可以确定deallocate
语句fred
确实没有被分配。
在Fortran 90中,分配状态可能未定义,甚至不允许allocated
。