如何使用指针数组在FORTRAN

时间:2017-08-04 15:03:19

标签: arrays pointers fortran

我希望能够重置数组中不在连续内存块中的元素。我想使用一个指针数组而不是一个指针数组,因为我对指针数组的理解是它们必须指向一个连贯的内存块(例如指针(1:10,1:10)=> target( 1: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

前两个语句idx(n)%p = 5是可以的,但我希望能够使用生成方法idx(1:n)%p = 5在一个语句中设置数组的块,但是当我这样做我得到以下编译错误:

Error: Component to the right of a part reference with nonzero rank must not have the POINTER attribute at (1)

我可以用某种方式使用指针设置一大块数组条目的值吗?也许它实际上可能是指针数组而不是指针数组......

我认为这与Fortran: using a vector to index a multidimensional array

有关

但是我无法在这里看到如何使用这个答案。

1 个答案:

答案 0 :(得分:1)

可能是一个扩展的评论而不是一个答案,但我需要一点格式化......

最好不要考虑Fortran支持指针数组。你已经掌握了(我认为)并构建了派生类型数组的常用解决方法,每个类型的实例都有一个指针元素。

为什么不使用多个向量下标(例如

)并不完全清楚
arr([2,4],[2]) = 5

(好吧,第二个下标是一个退化向量的东西,但该语句与你尝试使用指针的效果相同。)如果您愿意,可以使用数组下标三元组

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

也许你已经把你的需求简化得太过分以表达使用指针的必要性,在这种情况下,我的微弱建议将无法满足你未申报的需求。