我有一个二维的指针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)
---- ^`
答案 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操作。
所有这一切都假设人们想避免使用指针...