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

rub*_*bik 3 fortran

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

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

我在 OpenVMS 上使用相当新的编译器,因此我相信不会出现编译器问题。

Hig*_*ark 5

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

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

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

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

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

我预计有很多事情我已经忘记了。