首页 > 解决方案 > 将一维数组重塑为二维指针数组 Fortran

问题描述

uvw(:,:)我有一个二维指针,我有一个 1d 缓冲区数组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

错误消息说:

`错误 #8524:此数据指针分配的语法不正确:在此上下文中需要“绑定规范”或“绑定重新映射”。[1]

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

----^`

标签: pointersfortranintel-fortran

解决方案


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

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

此外,您需要一次性分配整个指针。也就是说,您不能在多个语句中使用“前十个元素指向该切片,后十个指向该切片”等等。

赋值语句将是

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

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


推荐阅读