【问题标题】:How to use of an array of pointers to assign non-adjacent array entries in FORTRAN如何使用指针数组在 FORTRAN 中分配不相邻的数组条目
【发布时间】:2017-08-04 15:03:18
【问题描述】:

我希望能够重置数组中不在连续内存块中的元素。我想为此使用一个指针数组而不是指针数组,因为我对指针数组的理解是它们必须指向一个连贯的内存块(例如指针(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: using a vector to index a multidimensional array有关

但我在这里看不到如何使用该答案。

【问题讨论】:

    标签: arrays pointers fortran


    【解决方案1】:

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

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

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

    arr([2,4],[2]) = 5
    

    (好的,第二个下标是一个退化向量,但该语句旨在与您尝试使用指针具有相同的效果。)如果您愿意,可以使用数组下标三元组来代替

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

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

    【讨论】:

    • 感谢 Mark 的注释 :) 事实上,我已经返回并编写了一个解决方案,使用索引数组来索引数据数组。只是,正如在我链接到的另一个stackoverflow问题中指出的那样(没有双关语),我似乎必须依次选择每个坐标(手动使用索引1,2,3):imark(memf3d(1: memf3dp,1),memf3d(1:memf3dp,2),memf3d(1:memf3dp,3))=1 我不喜欢以这种方式硬编码,因为认为指针可能会提供更灵活的解决方案,但似乎这从你说的可能是不可能的。谢谢!
    • 你的评论让我想知道你是否在问什么已经被称为 X/Y 问题 - 例如见meta.stackoverflow.com/questions/333921/…。我想知道您的问题是否不应该是如何对非连续数组部分进行分配(或操作)?。如果这是您真正的问题,请提出。
    • 我不太确定这是一个 X/Y 问题,我真的不明白为什么我不能使用与普通数组相同的符号 idx(:)%p .但最后我回到在循环中使用指针,因为我上面编辑中的解决方案没有按我的预期做(当然!)因为 arr([2,4],[3,2]) 设置了 4元素不是 2,所以即使使用直接索引,我也需要遍历坐标向量。因此,如果需要循环,do i=1,n idx(i)%p=5 end do 会更整洁(并且使用更少的内存?)。这是一个很长的说法,我的问题实际上是如何使用指针(不循环)来解决 arr
    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多