将1d数组重塑为2D指针数组Fortran

时间:2019-07-16 14:15:34

标签: pointers fortran intel-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)

     

---- ^`

2 个答案:

答案 0 :(得分:1)

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

指针边界重映射是一种使指针的形状与目标的形状不同的方法。特别地,指针和目标的等级可以不同。但是,在这种分配中,必须明确指定重新映射的下限和上限。仅仅使用:是不够的。

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

赋值语句应为

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)关联。上面的更正指针分配具有此功能。

答案 1 :(得分:0)

如果您希望避免使用指针,那么UNION / MAP是一个取决于编译器的选项。不久前将它添加到gfortran中...然后您可以将数组视为rank = 2,但也可以将向量(Rank = 1)用于SIMD操作。

所有这一切都假设人们想避免使用指针...