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

时间:2010-09-22 19:10:41

标签: fortran

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

有没有人有想法或经验将这些固定数组更改为动态,其余代码包括子程序调用会产生什么影响?

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

1 个答案:

答案 0 :(得分:4)

您是否可以更清楚地了解您目前的工作以及您打算做什么?你声明你已经超过了分配'数组,这表明你已经在使用动态数组,然后在下一句中你要求将固定数组更改为动态数据。

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

如果您希望继续使用遗留程序,那么我建议转换为可分配数组的工作将得到偿还。自从Fortran 90编译器广泛应用以来,我和其他大多数Fortran程序员一样,做了很多事情。努力偿还的方法之一是让您专注于维护的其他方面。鉴于现代计算机上的内存可用性,您需要更少关注使用此类空间,而不是一代以前编写代码的人。我希望代码的用户也试图解决比他们的祖先更大的问题。分配数组将提供一些未来验证的措施。

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

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

我希望我忘记了很多东西。