我有一个返回数组的函数:
PURE FUNCTION set_Xgrid() RESULT(x_grid)
REAL(dp), DIMENSION(:), ALLOCATABLE :: x_grid
INTEGER :: ii
ALLOCATE(x_grid(0:Nx-1))
DO ii=0,Nx-1
x_grid(ii) = x_o + ii*dx
END DO
END FUNCTION
然后我就这样调用这个函数:
REAL(dp), DIMENSION(:), ALLOCATABLE :: x
ALLOCATE(x(0:Nx-1))
x = set_Xgrid()
DO ii=0,Nx-1
PRINT '(I4,A10,F10.7)', ii, ", x(ii) = ", x(ii)
END DO
输出(前几行):
0, x(ii) = 0.0000000
1, x(ii) = 0.0101010
2, x(ii) = 0.0202020
即使上面的代码按预期工作,我也不太明白它是如何工作的。
我认为函数的RESULT
是隐式INTENT(OUT)
并且工作方式相同:忽略函数调用之前的任何值,并自动释放变量。如果是这种情况,代码会以某种方式记住变量x
是从索引0开始初始化的。
这是将函数的返回数组从索引0开始的正确方法吗?另外,我想了解函数返回数组时会发生什么。
答案 0 :(得分:2)
从特定索引开始返回数组没什么意义。无论如何它并不重要:
x(3:5)
x = f()
将适用于返回正确大小3的数组的任何函数,即使它从函数内部的42开始。
它绝对不能用作intent(out), allocatable
参数。这些值只是分配到数组的正确位置,从数组开始计算,而不是使用实际索引。
如果在分配之前未分配变量
real, allocatable :: x(:)
x = f()
然后它被分配为从1开始,具有正确的大小,再次,在函数内部开始的结果无关紧要。
答案 1 :(得分:1)
Vladimir F's answer涵盖了您需要了解的大部分内容。但是,还有更多细节需要添加。
重要的是,重复一下,函数结果根本不像intent(out)
虚拟变量。除非在此处不适用的情况下,函数结果充当表达式而不是变量。
你问
如果是这种情况,代码会以某种方式记住变量x是从索引0开始初始化的。
这是内在分配规则的结果(例如,参见Fortran 2008的7.2.1.3)。如果赋值左侧的变量是可分配变量,则可以首先取消分配 。这“可能”很重要:它并不总是被解除分配。
如果取消分配变量数组,则将使用右侧表达式的边界/形状重新分配它。无论函数结果的界限如何,表达式的下限都是1
。
但是,在您的情况下,变量数组的形状与表达式的形状相同。这里,变量在重新分配之前不会被释放。因此它保持其原始边界(下界0
)。