解除分配后的数组大小

Zeu*_*eus 4 arrays size fortran

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

  Integer, Allocatable :: fred(:)
  Allocate (fred(3))
  Write (*,*) "fred: ", Size (fred)
  Deallocate (fred)
  Write (*,*) "fred: ", Size (fred)
Run Code Online (Sandbox Code Playgroud)

fra*_*lus 11

真的,这是一个为规范的问题而哭泣的问题.为了在没有的情况下回答你的具体问题(据我所知,但我最终可能会写一个),我会回答.

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

因为你的代码fred是一个可分配的变量.如果执行了这个代码块,那么在最后一行size有一个参数,它是一个未分配的可分配变量.在这种情况下,如果它形成程序(程序单元)的一部分,那么该程序(程序单元)不是标准的符合程序(程序单元).

缺乏一致性并不是缺乏一致性,Fortran处理器需要检测到它是一个符合标准的Fortran处理器.

是的,处理器检测到这一点会很好,如果你在编译时选择合适的选项,很多人会这样做.按照流行的说法,允许使用标准的符合标准的处理器来响应此代码开始第三次世界大战.它也可以打印3.这完全取决于编译器供应商的心血来潮.

由评论提示,更多信息.

或许,期望解除分配的数组的大小为零是很诱人的.但是,解除分配的数组和具有零元素的数组是完全不同的东西,就像长度为零的字符与未分配的可分配字符不同.

特别是,我们有成语

fred = [fred, append]
Run Code Online (Sandbox Code Playgroud)

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

我同意High Performance Mark的评论,如果编译器要返回任何值,那么这0是一个糟糕的选择.就像大小没有明确定义一样,任何fred(3)根据返回的大小访问的尝试也是一个坏主意.同样,编译器可以自由地为此引用提供任何特定值.

最后,如果要检查数组是否已分配,则应使用allocated内在而不是依赖size返回0.当然,在这种情况下,它不是必需的,因为您可以确定在deallocate语句fred确实未分配之后.

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