2015-07-12 49 views
3

我创建了一个可分配数组。我分配元素,然后打印数组的大小。我感到奇怪的是,释放后大小保持不变。解除分配后的数组大小

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

这不是有效的Fortran代码:您获得的任何结果都可以用于Fortran处理器。 – francescalus

+0

你在说什么? – Zeus

+0

我已经回答了,但我确实对你相信正确的输出感兴趣。 – francescalus

回答

10

这是一个正在呼唤一个规范的问题,真的。为了在不存在的情况下回答你的具体问题(据我所知,但我最终可以写出一个问题),我会回答。

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

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

这种缺乏一致性并不是缺乏Fortran处理器要求检测为符合Fortran处理器的一致性。

是的,这对处理器来说很好,它会在编译时选择合适的选项。按照流行的说法,一个标准的符合处理器将被允许启动第三次世界大战来响应这个代码。它也可能打印3。这完全取决于编译器供应商的心血来潮。

由评论提示,更多信息。

这很诱人,也许,预计解除分配数组的大小为零。但是,释放数组和零元素的数组是完全不同的东西,就像零长度的字符与未分配的可分配字符不同一样。

特别是,我们有一个像

fred = [fred, append] 

成语时,不分配fred这是无效的,但是当它被分配但大小为0的有;在后一种情况下不需要特殊处理。

我同意High Performance Mark的评论,如果编译器要返回任何值,0是一个不好的选择。很大程度上,尺寸没有明确定义,例如根据返回的尺寸访问fred(3)也是一个坏主意。同样,编译器可以自由地给这个引用赋予任何特定的值。

最后,如果你想检查一个数组是否被分配,你应该使用allocated内在的而不是依赖size返回0。当然,在这种情况下,这是不需要的,因为您可以确定在deallocate声明fred确实未被分配之后。

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

+0

你总是可以用'分配(fred')检查 – Zeus

+0

我使用分配来检查,但是,当程序调用删除程序,我想告诉他,有没有数据可用,所以我表现出值为0。他然后可以用他想要的数据填充它。 – Zeus

+0

有可能是一个隐含的问题,我没有注意到(我倾向于没有注意到任何问题的背景 - 这是我的错)。如果你能更清楚地解释你想要的是什么,我会再次尝试回答。然而,从根本上说,一个非分配数组应该(通过编译器和程序员)与大小为0的分配数组的处理方式完全不同。 – francescalus