将一维数组重塑为二维指针数组 Fortran

Reshaping 1d array to 2D pointer array Fortran

我有一个二维指针uvw(:,:),我有一个一维缓冲区数组x(:)

现在我需要点uvw(1,:)=>x(1:ncell)uvw(2,:)=>x(ncell+1:ncell*2)

我做了一个很简单的例子。我知道指针数组不起作用,但是有人知道如何解决这个问题吗?

PS:出于务实的原因,我不想用声明的类型包装我的 uvw。 (我正在更改一些代码,并且需要 uvw 作为 2D 指针。目前是一个数组,我的想法是避免更改 uvw 的使用方式,因为它被使用了数千次)

 program test

 real, allocatable,target :: x(:)
 real, pointer :: ptr(:,:)


allocate(x(100) )


x = 1.

ptr(1,:) => x(1:10)

end program

错误消息说:

`error #8524: The syntax of this data pointer assignment is incorrect: either 'bound spec' or 'bound remapping' is expected in this context. [1]

ptr(1,:) => x(1:10)

----^`

您正在尝试执行指针边界重映射,但您的语法和方法不正确。

指针边界重映射是一种使指针形状不同于目标形状的方法。特别是,指针和目标的等级可能不同。然而,在这样的分配中,有必要明确指定重新映射的下限和上限;仅使用 : 是不够的。

此外,您需要一次性分配整个指针。也就是说,你不能在多个语句中有 "the first ten elements point to this slice, the next ten to this slice" 等等。

赋值语句为

ptr(1:10,1:10) => x

请注意,这也意味着您实际上无法拥有想要的东西。您要求元素 ptr(1,1:10) 对应于 x(1:10) 并且 ptr(2,2:10) 对应于 x(11:20)。这是不可能的:数组元素必须按顺序匹配:ptr(1:10,1) 作为 ptr 的前十个元素必须与前十个元素 x(1:10) 相关联。上面修正后的指针赋值有这个。

如果您更喜欢避免使用指针,那么 UNION/MAP 是一个选项,具体取决于编译器。它是前一段时间添加到 gfortran 中的……那么您可以将数组视为 rank=2,但也可以将向量 (Rank=1) 用于 SIMD 操作。

所有这些都假设一个人想要避免指针...