指向数组 returns 相同地址的指针的 Fortran 数组

Fortran array of pointer to array returns same address

我想创建一个动态分配的数组指针数组if/when我的结果已准备就绪。下面的代码使用类型来解决无法设置指针数组的问题,但是函数 makeArray 总是返回 same 内存地址。

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

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

谢谢

编辑 已解决,为了post诚实,我会把它留在这里: 我想问题的症结在于能够分配一个二维数组,其中二维可能会有很大差异。 我需要寻找的魔法词是“参差不齐的数组”,似乎 this post 回答了我的问题。

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

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

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

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