gpt4 book ai didi

arrays - 解除分配后数组的大小

转载 作者:行者123 更新时间:2023-12-04 22:30:04 24 4
gpt4 key购买 nike

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

  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 时无效未分配,但在分配但大小为零时分配;在后一种情况下不需要特殊处理。
我同意高性能标记的评论,如果编译器要返回任何值, 0是一个糟糕的选择。尽管大小没有明确定义,但任何访问 fred(3) 的尝试都是如此。 ,比如说,基于返回的大小,也是一个坏主意。同样,编译器可以自由地为此引用提供任何特定值。
最后,如果你想检查一个数组是否被分配,你应该使用 allocated内在而不是依赖 size返回 0 .当然,在这种情况下不需要它,因为您可以确定在 deallocate 之后声明 fred确实没有分配。
在 Fortran 90 中,分配状态可能是未定义的,甚至是 allocated。不被允许。

相同的想法适用于数组和 size 以外的事物。固有的。 size是一个查询函数,它要求分配查询的数组(如果是可分配实体)或关联的指针(如果是指针)。同样,例如,必须分配具有延迟长度的字符/关联指针(如果适用)作为 len 的参数。内在查询功能。
查询函数并不总是需要分配/关联参数。例如,即使没有分配变量,也可能会询问显式长度字符的长度。应检查文件中的要求,不要进行不允许的查询。

关于arrays - 解除分配后数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31373727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com