Arrays 如何在FORTRAN中使用指针数组分配非相邻数组项

Arrays 如何在FORTRAN中使用指针数组分配非相邻数组项,arrays,pointers,fortran,Arrays,Pointers,Fortran,我希望能够重置数组中不在连续内存块中的元素。我认为应该使用指针数组而不是指针数组,因为我对指针数组的理解是它们必须指向一致的内存块,例如指针1:10,1:10=>target1:100 我的简单测试程序如下: program test implicit none integer, target :: arr(4,4) type ptr integer, pointer :: p end type ptr type(ptr), dimension(2) :: id

我希望能够重置数组中不在连续内存块中的元素。我认为应该使用指针数组而不是指针数组,因为我对指针数组的理解是它们必须指向一致的内存块,例如指针1:10,1:10=>target1:100

我的简单测试程序如下:

program test
  implicit none

  integer, target :: arr(4,4)

  type ptr
    integer, pointer :: p
  end type ptr

  type(ptr), dimension(2) :: idx 

  arr=0

  idx(1)%p=>arr(2,2) 
  idx(2)%p=>arr(4,2)

  idx(1)%p=5 ! this is okay 
  idx(2)%p=5 ! this is okay  
  idx(1:2)%p=5 ! this gives an error

  print *,arr

end program test
前两条语句idxn%p=5没有问题,但我希望能够使用生成方法idx1:n%p=5在一条语句中设置数组块,但执行此操作时会出现以下编译错误:

Error: Component to the right of a part reference with nonzero rank must not have the POINTER attribute at (1)
我可以用指针设置数组项块的值吗?也许事实上,使用指针数组而不是指针数组是可能的

我认为这与


但我不知道如何在这里使用这个答案。

可能是一个扩展注释而不是答案,但我需要一些格式

最好不要想到Fortran支持指针数组。您已经了解了这一点,我认为并构建了派生类型数组的常见解决方法,该类型的每个实例都有一个元素,即指针

不完全清楚的是为什么不使用多个向量下标,例如

arr([2,4],[2]) = 5
好的,第二个下标是一个退化向量,但该语句的作用与使用指针的尝试相同。如果愿意,可以使用数组下标三元组

arr(2:4:2,2) = 5

也许您将您的需求简化得太多,无法表达使用指针的必要性,在这种情况下,我的微弱建议将无法满足您未声明的需求。

感谢注释标记:事实上,我已经返回并编写了一个解决方案,使用索引数组对数据数组进行索引。只是,正如我链接到的另一个stackoverflow问题中所指出的,没有双关语,我似乎必须手动使用索引1,2,3依次选择每个坐标:imarkmemf3d1:memf3dp,1,memf3d1:memf3dp,2,memf3d1:memf3dp,3=1,我不喜欢以这种方式硬编码,因为我认为指针可能提供更灵活的解决方案,但从你所说的来看,这似乎是不可能的。谢谢你的评论让我想知道你是否在问一个X/Y问题——例如,见。我想知道你的问题是否不应该是我如何对非连续数组段进行赋值或操作?。如果这是你真正的问题,那就去问吧。我不确定这是不是一个X/Y问题,我真的不明白为什么我不能像普通数组那样使用相同的符号idx:%p。但最后我还是在循环中使用指针,因为我上面编辑的解决方案当然没有达到我的预期!因为arr[2,4],[3,2]设置了4个元素而不是2,所以即使使用直接索引,我也需要在坐标向量中循环。因此,如果需要一个循环,do i=1,n idxi%p=5 end do更整洁,占用的内存更少?。这是一个很长的说法,我的问题是如何在不循环的情况下使用指针来解决arr