将一维数组重塑为二维指针数组 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 操作。
所有这些都假设一个人想要避免指针...
我有一个二维指针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 操作。
所有这些都假设一个人想要避免指针...