【问题标题】:Fortran array of pointer to array returns same address [duplicate]指向数组的指针的Fortran数组返回相同的地址[重复]
【发布时间】:2021-08-14 05:32:29
【问题描述】:

我想创建一个指向数组的指针数组,如果/当我的结果准备好时动态分配这些指针。以下代码使用一种类型来解决无法设置指针数组的问题,但函数 makeArray 始终返回 same 内存地址。

预期结果将是不同的地址,因此是可单独控制的数组。 (我需要这样做,因为我有非常非常大的数组,这些数组将随机填充但必须排序,而且我不想预先分配一个巨大的 2x2 数组(8GB 的​​顺序),也不想经常重新分配和排序为新结果出现了,所以我的解决方案是预分配一个大的 1x1 数组,该数组可以有指向第二个暗淡的指针,这意味着如果/当它可用时,我可以将指向结果的指针放在正确的“槽”中)

module mymodule 
contains

function makeArray(size)
  integer :: size
  integer, target, allocatable :: a(:)
  integer, pointer :: makeArray(:)
  allocate(a(size))
  a = 0
  makeArray => a
  end function 
  end module mymodule

program test
  use mymodule
  implicit none
 
  type :: IntPointer
    integer, pointer :: ptr(:)
    integer :: id
  end type
  
  type(IntPointer), allocatable :: ptrarray(:)
  integer :: i

  
 allocate(ptrarray(5))
 ptrarray(1)%ptr => makeArray(1277)
  ptrarray(1)%id = 1
 ptrarray(2)%ptr => makeArray(13567)
  ptrarray(2)%id = 2

  ptrarray(1)%ptr(12) = 10

  do i=1, size(ptrarray)
  write(*,*) ptrarray(i)%id
  write(*,*) LOC(ptrarray(i)%ptr)
  end do


end program

谢谢

EDIT 已解决,我将把它留在这里以供后代使用: 我想问题的症结在于能够分配一个二维数组,其中二维可以显着变化。 我需要寻找的神奇词是“Ragged Array”,看来this 的帖子回答了我的问题。

【问题讨论】:

  • 通常需要问的问题是你确定要指针吗?
  • @steve 我想问题的症结在于能够分配一个二维数组,其中二维可能有很大差异。我需要寻找的神奇词是“Ragged Array”,似乎 this 帖子回答了我的问题
  • @Luke 另见stackoverflow.com/questions/67697060/… 这个词也是jagged数组。

标签: arrays function pointers fortran intel-fortran


【解决方案1】:

当我使用带有足够调试选项的 gfortran 时,它给出了答案:

   10 |   makeArray => a
      |  1
Warning: Pointer at (1) in pointer assignment might outlive the pointer target [-Wtarget-lifetime]

因为a是可分配的,所以当函数退出时,它会被自动释放。

但是如果您尝试通过将save 添加到a 的声明来解决此问题,当您第二次调用函数makeArray 时,该函数将尝试分配一个已经分配的变量。可能没有中间 a 的新设计会更好。或者可能是与稀疏数组不同的数据结构。也许是一个链表?

【讨论】:

  • 谢谢,我怎样才能避免对 a 的中间分配?本质上,我想避免命名数组,而只分配一些我有地址的数组。这在 Fortran 中可能吗?链表是可能的,但我真的希望 O(1) (?) 性能能够访问数组的任何成员,而不必遍历列表,这将是数百万个元素。
  • 我想问题的症结在于能够分配一个二维数组,其中二维可能有很大差异。我需要寻找的神奇词是“Ragged Array”,似乎 this 帖子回答了我的问题
猜你喜欢
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
相关资源
最近更新 更多