Я пытаюсь скопировать цель на указатель в переменной производного типа на другую переменную того же типа, но я не знаю, как это сделать
Скажите, что у меня разбросанный список точекчто я хочу триангулировать. У меня будет
type :: triangulation
type(vertex), allocatable :: points(:)
type(triangle), allocatable :: triangles(:)
end type triangulation
Для экономии памяти я определяю каждый треугольник, используя указатели на узлы:
type :: triangle
type(vertex), pointer :: A => null()
type(vertex), pointer :: B => null()
type(vertex), pointer :: C => null()
end type triangle
, которые будут находиться в одном и том же объекте. Например, чтобы сгенерировать новый треугольник в триангуляции, я запущу:
type(triangle) function triangulation_new_triangle(this,iA,iB,iC) result(tri)
class(triangulation), intent(in), target :: this
integer, intent(in) :: iA, iB, iC ! Indices of the three nodes
tri%A => this%points(iA)
tri%B => this%points(iB)
tri%C => this%points(iC)
end function
Теперь предположим, что мне нужно перераспределить список треугольников. Как мне скопировать его в новый список для той же триангуляции, не теряя ссылки на указатели? То есть я хочу сделать что-то вроде этого:
subroutine triangulation_reallocate(this)
class(triangulation), intent(inout) :: this
! Local variables
integer, parameter :: TRIANGLE_CHUNK_SIZE = 1024
integer :: old_size
type(triangle), allocatable :: new_triangle_pool(:)
! Get old size
old_size = merge(size(this%triangles),0,allocated(this%triangles))
! Allocate new array of triangles
allocate(new_triangle_pool(old_size+TRIANGLE_CHUNK_SIZE))
! Copy data from old to new array
[..... missing code here .......]
! Move allocation back to the triangulation object
call move_alloc(from=new_triangle_pool,to=this%triangles)
end subroutine triangulation_reallocate
Я думаю о способе скопировать ассоциации треугольника. Если я сделаю что-то вроде:
do i=1,old_size
new_triangle_pool(i) = this%triangles(i)
end do
будет ли это работать? Я обеспокоен тем, что если я скопирую что-то вроде:
new_triangle_pool(i)%A => this%triangles(i)%A
, то это указатель на указатель, а не на исходную вершину, и ассоциация будет потеряна, когда старые переменные this%triangles
освобожден?