指向数组的指针的 Fortran 数组返回相同的地址

问题描述

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

预期的结果将是不同的地址,因此是单独可控的阵列。 (我需要这样做是因为我有非常大的数组,这些数组将随机填充但必须排序,而且我不想预先分配一个巨大的 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 帖子回答了我的问题。

解决方法

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

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

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

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