我必须在Fortran 77中编写一个子程序(我正在使用英特尔Fortran),它从文本文件中读取测量值并将它们存储在矩阵中。
由于测量值的数量总是可变的,我必须动态分配矩阵。
我知道动态分配只能来自Fortran 90,但当时人们遇到了同样的问题,所以也有可能。 你会怎么做?
我不想为矩阵预留太多空间,因为这种方法对我来说是不切实际的。
答案 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让我确信它不是。