Fortran 77 中的动态数组
Dynamic array in Fortran 77
我必须在 Fortran 77 中编写一个子程序(我使用的是 Intel Fortran),它从文本文件中读取测量值并将它们存储在矩阵中。
由于测量值的数量总是可变的,我必须动态分配矩阵。
我知道动态分配只能从Fortran 90开始,但当时人们有同样的问题,所以也是可以的。
您将如何进行?
我不想为矩阵保留太多space,因为这种方法对我来说不切实际
如果你真的受限于 Fortran 77,你就不要做动态分配。相反,声明一个比您认为可能需要的数组更大的数组,但又不会太大以防止程序在您的目标系统上运行 运行。然后将您的值存储在该大数组中,分别跟踪您使用的大数组中的元素数量。如果您选择的数组大小不够大,请告知用户并终止程序。
人们发现 Fortran 77 中缺乏动态分配非常受限,因此他们经常求助于使用非标准语言扩展。如果您决定沿着语言扩展的道路前进,那么目前在这种情况下使用的 Fortran 77 的最佳扩展是 Fortran 90 引入的可分配数组功能。我认为可以公平地说,所有积极维护的编译器都可以handle Fortran 77 也将处理 Fortran 90 可分配数组(然后是一些)。
正如许多人指出的那样,您不必坚持使用 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 让我相信它不是。
我必须在 Fortran 77 中编写一个子程序(我使用的是 Intel Fortran),它从文本文件中读取测量值并将它们存储在矩阵中。
由于测量值的数量总是可变的,我必须动态分配矩阵。
我知道动态分配只能从Fortran 90开始,但当时人们有同样的问题,所以也是可以的。 您将如何进行?
我不想为矩阵保留太多space,因为这种方法对我来说不切实际
如果你真的受限于 Fortran 77,你就不要做动态分配。相反,声明一个比您认为可能需要的数组更大的数组,但又不会太大以防止程序在您的目标系统上运行 运行。然后将您的值存储在该大数组中,分别跟踪您使用的大数组中的元素数量。如果您选择的数组大小不够大,请告知用户并终止程序。
人们发现 Fortran 77 中缺乏动态分配非常受限,因此他们经常求助于使用非标准语言扩展。如果您决定沿着语言扩展的道路前进,那么目前在这种情况下使用的 Fortran 77 的最佳扩展是 Fortran 90 引入的可分配数组功能。我认为可以公平地说,所有积极维护的编译器都可以handle Fortran 77 也将处理 Fortran 90 可分配数组(然后是一些)。
正如许多人指出的那样,您不必坚持使用 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 让我相信它不是。