我希望能够重置数组中不在连续内存块中的元素。我想使用一个指针数组而不是一个指针数组,因为我对指针数组的理解是它们必须指向一个连贯的内存块(例如指针(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
有关但是我无法在这里看到如何使用这个答案。
答案 0 :(得分:1)
可能是一个扩展的评论而不是一个答案,但我需要一点格式化......
最好不要考虑Fortran支持指针数组。你已经掌握了(我认为)并构建了派生类型数组的常用解决方法,每个类型的实例都有一个指针元素。
为什么不使用多个向量下标(例如
)并不完全清楚arr([2,4],[2]) = 5
(好吧,第二个下标是一个退化向量的东西,但该语句与你尝试使用指针的效果相同。)如果您愿意,可以使用数组下标三元组
arr(2:4:2,2) = 5
也许你已经把你的需求简化得太过分以表达使用指针的必要性,在这种情况下,我的微弱建议将无法满足你未申报的需求。