Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 遗留代码中的动态数组与静态数组_Fortran - Fatal编程技术网

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

Fortran 遗留代码中的动态数组与静态数组,fortran,Fortran,我负责一些遗留(F77)项目。有时,由于试图超过固定的数组大小,一个或另一个可能会失败。我通常的解决方法是对有问题的数组进行过度分配 是否有人有将这些固定数组更改为动态数组的想法或经验,以及对代码的其余部分(包括子例程调用)有何影响 我在OpenVMS上使用了一个相当新的编译器,所以我相信不会有编译器问题。您能更清楚地了解一下您目前正在做什么以及您打算做什么吗?您声明您“远远超过了分配”数组,这表明您已经在使用动态数组,然后在下一句中,您将询问如何将固定数组更改为动态数组 也许您的意思是,您在编

我负责一些遗留(F77)项目。有时,由于试图超过固定的数组大小,一个或另一个可能会失败。我通常的解决方法是对有问题的数组进行过度分配

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


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

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

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

如果您希望继续使用遗留程序,那么我建议您将其转换为可分配阵列的努力将得到回报。自从Fortran 90编译器被广泛使用以来,我和我怀疑大多数其他Fortran程序员都做了很多这方面的工作。付出的努力得到回报的方式之一是让您能够专注于维护的其他方面。考虑到现代计算机内存的可用性,与上一代人编写代码的人相比,你不必太在意使用这样的空间。我预计代码的用户也在试图解决比他们的祖先更大的问题。分配阵列将提供某种程度的未来证明

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

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

我想我已经忘记了很多东西。

对子程序的影响问题是:如果我链接到一个对象库,那么对子程序(对象)进行更改可能有点冒险,如果主程序使用动态数组调用具有固定大小数组的子例程,是否会出现问题?将arr1(5000)更改为arr1(20000),这样我以后就不必再讨论这个问题了。感谢您的回答和评论!我觉得我能够满怀信心地继续进行这些更改,尤其是在生产计划方面,因为不幸的是,客户对开发与生产环境几乎没有准备。我认为,您的第三个要点对于最初的问题至关重要-一旦分配,您可以将其视为正常阵列,将其传递给最初不是用可分配数组设计的旧的子例程。