【发布时间】:2017-03-30 14:06:28
【问题描述】:
我开始学习 Fortran,具有 C++/Matlab/Java 背景。我意识到一些 Fortran 程序员仍然坚持使用 F77,可能是因为他们不喜欢面向对象、命名空间之类的东西,并且习惯了旧语法。
我知道您可以编写没有 OOP 的程序。我不明白的是,如果没有动态内存管理,你怎么办。有一千个您事先不知道数组大小的示例 - 例如将完整矩阵转换为稀疏矩阵时。
当然,现代 Fortran 提供“自动数组”和“可分配数组”。但这些在 1977 年并不存在。没有这些构造,F77 家伙如何管理?
【问题讨论】:
-
FORTRAN 77 曾经/现在主要用于科学计算,其中一些选定的初始条件(例如固定大小的字段)在很长一段时间内演变,写出数据。运行期间没有用户输入,您确切知道阵列需要多大。 Fortran 代码通常被认为更高效的部分原因。
-
@Ed Smith 好吧,在科学计算中肯定有很多固定大小的应用(例如数值线性代数),但也有很多未知大小的应用(非结构化网格划分、可变步长的时间积分,稀疏矩阵等)
-
很难用 fortran77 实际编译,因为大多数编译器都是 F90、F95 或更高版本,并且它们向后兼容。所以大多数稳定的 F77 代码不需要更改,或者通常不需要更改。即使是从 F77 开始的青少年,也将 >= 40,而 F90 大约存在 2.5 年。第一次计算出 ALLOCATABLE 大约需要 10 分钟,但它很容易放入。如果代码以流方式在 32k 部分上工作,那么保持原样通常更容易。
-
在我知道的一个大型 F77 程序中,它首先使用 C malloc() 分配一大块内存(根据启动时来自输入文件的用户请求),然后程序使用类似堆栈的机制来访问该内存的一部分。通过使用只有长度为 1 的数组的公共块(例如,common /MEM/ X(1))并让子程序知道与 X(1) 的地址的偏移量和(第一个元素) C 分配的内存,加上每个例程请求的必要数量。所以这很尴尬,但仍然在该代码中用作主内存机制:)
-
自动数组是80年代在多个平台上支持的扩展,因此被f90采用
标签: fortran dynamic-memory-allocation fortran77