gpt4 book ai didi

fortran - 遗留代码中的动态与静态数组

转载 作者:行者123 更新时间:2023-12-01 13:04:56 25 4
gpt4 key购买 nike

我负责许多遗留 (F77) 程序。有时一个或另一个可能会由于试图超过固定的数组大小而失败。我通常的解决方法是方式过度分配有问题的数组。

有没有人有将这些固定数组更改为动态数组的想法或经验,以及对其余代码(包括子例程调用)的影响是什么?

我在 OpenVMS 上使用了一个相当新的编译器,所以我相信不会有编译器问题。

最佳答案

您能否更清楚地了解您目前正在做什么以及您打算做什么?您声明您“过度分配”数组,这表明您已经在使用动态数组,然后在下一句话中您询问是否将固定数组更改为动态数组。

也许你的意思是你在编译时定义的数组比你预期使用的空间多?这是 Fortran 程序员长期以来的工作方式之一。然而,自 Fortran 90 以来,该语言以标准方式支持动态数组,即那些大小在运行时确定的数组。关键字 ALLOCATABLE 用于声明此类数组,并使用 ALLOCATE 过程为它们提供空间(通常在堆上)。当然,此后数组大小是固定的。要动态扩展一个数组,您通常必须分配一个更大的数组,然后复制元素。

如果您希望继续使用您的遗留程序,那么我建议转换为可分配数组的努力将得到返回。自从 Fortran 90 编译器广泛可用以来,我和大多数其他 Fortran 程序员在这些年里已经做了很多事情。返回努力的方式之一是让您专注于维护的其他方面。考虑到现代计算机内存的可用性,与上一代编写代码的人相比,您不必担心使用这些空间。我希望代码的用户也正在尝试解决比他们的祖先大得多的问题。分配数组将提供一些面向 future 的措施。

至于对代码其他部分的影响,考虑一下:

  • 使用完数组后取消分配。
  • 在子程序和函数内部分配的数组会在退出时自动释放,除非您将数组返回给调用单元——但这只有在 Fortran 2003 及更高版本中才有可能(根据标准,您的编译器可能不同)。<
  • 如果您分配了一个数组,您可以将它传递给子程序,也可以从子程序中取出它,就像您可以传递任何其他数组一样。
  • 在 FORTRAN77 中,标准做法是将数组的维度传递到包含该数组的子程序中;在 Fortran 90 及更高版本中,您不必这样做,如果您需要知道大小,则可以使用 SIZE 内在函数。使用全数组语法,您通常不需要知道数组的大小。
  • 与其重写大量数组处理代码,您可能会发现围绕它编写包装器更容易。
  • 作为一种良好做法,您应该检查 ALLOCATE 语句的 stat 选项的值。

我想我忘记了很多东西。

关于fortran - 遗留代码中的动态与静态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3772771/

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