Fortran指向较小维数组的指针

时间:2017-11-30 21:07:47

标签: pointers fortran

我想创建一个指向尺寸较小的数组的指针。 例如,我有一些数组arr(1:2, 1:10, 1:10)

现在我想创建一个指向arr(1:1, 1:10, 1:10)的指针,但我想首先删除我不知道应该如何命名它看起来像索引,第二指针指向(2:2,1:10) ,1:10)。

我需要它,因为我想将具有2维(矩阵)的数组发送到函数。

以下是使用伪代码表示我想要做的事情。

INTEGER, DIMENSION (1:2, 1:10, 1:10), TARGET :: BOUNDRIES
INTEGER, DIMENSION (:,:), POINTER : LEFT_BOUNDRY

LEFT_BOUNDRY => BOUNDRIES(1,1:10,1:10)
DO i = 1,n
    DO j = 1,10
    write(*,*) LEFT_BOUNDRY(i,j)
    END DO
END DO

有可能吗?

1 个答案:

答案 0 :(得分:1)

当我们在函数或子例程(统称为过程)中有 dummy 参数时,我们在执行该过程时会有相应的实际参数。考虑子例程s

subroutine s(x)
  real x(5,2)
  ...
end subroutine s

伪参数x在这种情况下是一个显式的形状数组,排名为2,形状为[5,2]

如果我们想要

call s(y)

其中y是某些real的东西,我们不需要y整数数组,其排名为2,形状为[5,2]。我们只需要y至少有十个元素,当我们在子例程中时,一个名为存储关联的东西将这十个元素映射到x

想象一下,然后

real y1(10), y2(1,10), y3(29)
call s(y1)
call s(y2)
call s(y3)

这些中的每一个都有效(在最后一种情况下,它只是与伪参数关联的前十个元素)。

至关重要的是,它是一个所谓的元素序列,在选择与x相关联的元素时非常重要。考虑

real y(5,12,10,10)
call s (y(1,1,1:2,3:7))

这是十个元素中y的数组部分。这十个元素在子例程x中一起变为s

总而言之,如果你想将arr(2,1:10,1:10)(实际上是一个2级数组部分)传递给第2级参数,这是一个不超过100个元素的显式形状数组,一切都很好。