我希望能够重置不在连续内存块中的数组中的元素。我想为此使用指针数组而不是指针数组,因为我对指针数组的理解是它们必须指向一个连贯的内存块(例如指针(1:10,1:10)=>目标(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相关:使用向量来索引多维数组
但我在这里看不到如何使用该答案。
可能是扩展评论而不是答案,但我需要一些格式...
最好不要考虑 Fortran 支持指针数组。您已经掌握了这一点(我认为)并构建了派生类型数组的通常解决方法,该类型的每个实例都有一个指针元素。
不完全清楚的是为什么不使用多个向量下标,例如
arr([2,4],[2]) = 5
(好吧,第二个下标是一个退化向量,但该语句旨在与您尝试使用指针具有相同的效果。)如果您愿意,您可以使用数组下标三元组代替
arr(2:4:2,2) = 5
也许您已经将您的需求简化得太远,无法表达使用指针的必要性,在这种情况下,我的微弱建议将无法满足您未声明的需求。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句