如何使函数返回从索引0开始的数组

时间:2016-02-15 10:42:03

标签: arrays fortran

我有一个返回数组的函数:

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开始的正确方法吗?另外,我想了解函数返回数组时会发生什么。

2 个答案:

答案 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)。