Копирование ассоциации указателей в структуре производного типа на Фортране - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь скопировать цель на указатель в переменной производного типа на другую переменную того же типа, но я не знаю, как это сделать

Скажите, что у меня разбросанный список точекчто я хочу триангулировать. У меня будет

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освобожден?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...