Fortran 77中的动态数组

时间:2016-11-08 16:03:50

标签: arrays fortran dynamic-memory-allocation fortran77 dynamic-allocation

我必须在Fortran 77中编写一个子程序(我正在使用英特尔Fortran),它从文本文件中读取测量值并将它们存储在矩阵中。

由于测量值的数量总是可变的,我必须动态分配矩阵。

我知道动态分配只能来自Fortran 90,但当时人们遇到了同样的问题,所以也有可能。 你会怎么做?

我不想为矩​​阵预留太多空间,因为这种方法对我来说是不切实际的。

2 个答案:

答案 0 :(得分:3)

如果您真的受限于Fortran 77,则不进行动态分配。相反,声明一个比您认为可能需要的数组更大的数组,而不会太大而无法阻止程序在目标系统上运行。然后将值存储在该大型数组中,分别跟踪您使用的大型数组的元素数。如果您选择的数组大小不够大,请让用户知道并终止该程序。

人们发现Fortran 77中缺乏动态分配非常严格,因此他们经常使用非标准语言扩展。如果您决定沿着语言扩展的道路前进,那么现在Fortran 77在这种情况下使用的最佳扩展是Fortran 90引入的可分配数组功能。我认为可以说所有主动维护的编译器都可以处理Fortran 77还将处理Fortran 90可分配数组(然后是一些)。

答案 1 :(得分:0)

正如许多人所指出的那样,即使已经编写的大部分内容与Fortran77兼容,您也不必坚持使用Fortran77。即使是在Fortran 95 See Wikipedia for a list中删除的少数功能,只要您不在同一文件中从固定表单切换到自由表单,您的编译器可能仍然可以正常工作。

在F90之前,人们可能会做的是声明(希望)大到足以满足任何用例的数组,然后只使用该数组的第一个元素。

我不确定但可能有用的一件事是改变范围。简短的例子:

      subroutine main(n)
          implicit none
          integer n
          integer a(n)
          print*, "Please enter the ", n, " numbers"
          read*, a
          print*, "Sum is ", sum(a)
      end subroutine main

      program dynamic
          implicit none
          integer n
          print*, "Enter size of array:"
          read*, n
          call main(n)
      end program dynamic

我很想知道这是否符合Fortran77标准。老实说,我不知道。 @francescalus让我确信它不是。