有没有办法在 Fortran 中创建可变大小的数组在堆栈上? Allocate() 对我不起作用,因为它将数组放在堆上。这可能会导致并行化问题(请参阅我的另一个问题: OpenMP: poor performance of heap arrays (stack arrays work fine) )。当然,一些智能内存管理可以解决这个问题,但是 Fortran 中的内存管理听起来很傻。
基本上,我正在寻找与 C 语言中以下内容的 Fortran 等效项:
scanf("%d", N);
int myarray[N];
重申:我不想
Integer, PARAMETER :: N=100
Integer, Dimension(N) :: myarray
因为这决定了编译时的数组大小。我也不想
Integer, Dimension(:), Allocatable :: myarray
read(*,*) N
Allocate(myarray(1:N))
因为它将数组放在堆上。
帮助非常感谢。在我最近遇到上述问题中的问题之前,我对 Allocatable 数组非常满意。如果对这个问题有否定的答案,我将非常感谢源链接。
编辑:查看对 M.S.B. 答案的评论。只有在 Fortran 2008 中才有可能做到这一点的优雅方式,并且它是在 block
构造中完成的。
最佳答案
Fortran 可以自动创建数组,只需要在子例程的入口处声明,只要在运行时知道维度……这不需要声明维度参数属性,它们可以是参数,例如,
subroutine MySub ( N )
integer, intent (in) :: N
real, dimension (N) :: array
有效。那么为什么不在主程序或某个子程序中决定你的大小“N”,然后调用另一个子程序继续。使用这种方法,数组可能会在堆栈上。正如@eriktous 所写,Fortran 语言标准没有指定这种行为。一些编译器将本地数组切换到超过一定大小的堆。一些编译器提供了控制这种行为的选项。在堆上放置大型数组可能会被递归或 OpenMP 覆盖。
您还可以将可分配数组作为实际参数传递给子例程,而无需将子例程的虚拟参数声明为可分配的。这可能对您的担忧没有帮助,因为原始数组可能仍然在堆上。
关于arrays - Fortran 中没有 Allocate() 的可变大小数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6617015/