gpt4 book ai didi

Fortran 数组和子程序(子数组)

转载 作者:行者123 更新时间:2023-12-04 22:16:55 26 4
gpt4 key购买 nike

我正在浏览 Fortran 代码,有一点让我有点困惑。

有一个子程序,比如说

SUBROUTINE SSUB(X,...)
REAL*8 X(0:N1,1:N2,0:N3-1),...
...
RETURN
END

在另一个子程序中通过以下方式调用:
CALL SSUB(W(0,1,0,1),...)

其中 W 是一个“工作数组”。似乎来自 W 的特定值传递给 X,但是,X 的维度是数组。这是怎么回事?

最佳答案

这是让子例程在原始数组的(N 维矩形)子集上工作的不常见习惯用法。

Fortran 中的所有参数(至少在 Fortran 90 之前)都是通过引用传递的,因此实际的数组参数被解析为内存中的一个位置。在为整个数组分配的空间内选择一个位置,子程序只操作数组的一部分。

最大的问题: 你必须知道 be aware of how the array is laid out in memory 以及 Fortran 的数组索引方案是如何工作的。 Fortran 使用列主数组排序,这与 c 的约定相反。考虑一个大小为 5x5 的数组(并从 0 索引两个方向,以便与 c 进行比较)。在两种语言中,0,0 是内存中的第一个元素。在 c 中,内存中的下一个元素是 [0][1] 但在 Fortran 中它是 (1,0) 。这会影响您在选择子空间时删除哪些索引:如果原始数组是 A(i,j,k,l),并且子例程在三维子空间上工作(如您的示例中所示),则在 c 中它在 Aprime[i=constant][j][k][l] 上工作,但在 Fortran 中,在 Aprime(i,j,k,l=constant) 上工作。

另一个风险是环绕。子程序中(子)数组的维度必须与调用程序中的维度匹配,否则会发生奇怪的、奇怪的事情(想想看)。因此,如果 A 的大小被声明为 (0:4,0:5,0:6,0:7),并且我们使用元素 A(0,1,0,1) 调用,则接收例程可以自由地在它喜欢的地方开始每个维度的索引,但是必须使大小 (4,5,6) 否则;但这意味着 j 方向的最后一个元素实际上是环绕的!要做的事情不是使用最后一个元素。确保这种情况发生是程序员的工作,而且是一件麻烦事。小心。多照顾。

关于Fortran 数组和子程序(子数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2494818/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com