指向数组 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
的新设计会更好。或者可能是与稀疏数组不同的数据结构。也许是链表?
我想创建一个动态分配的数组指针数组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
的新设计会更好。或者可能是与稀疏数组不同的数据结构。也许是链表?