В моей программе я хочу создать контейнерный тип, содержащий массив определенного производного типа. Я хочу добавить процедуры с привязкой к типу для контейнера, которые вызывают процедуры для всех компонентов массива. Поскольку размер массива варьируется, я попытался использовать функцию автоматического перераспределения. Я столкнулся с проблемами с выделяемыми символами.
Вот небольшой фрагмент, показывающий настройку:
module realloc_test
implicit none
type :: number_t
character(:), allocatable :: number_c ! this does not work
! character(len=10) :: number_c ! this works
integer :: number_i
end type number_t
type number_container
integer :: listsize
type(number_t), allocatable, dimension(:) :: all_numbers
contains
procedure add
end type number_container
contains
subroutine add (this, number_in)
class(number_container), intent(inout) :: this
type(number_t), intent(inout) :: number_in
if (.not. allocated(this%all_numbers)) then
allocate(this%all_numbers(1), source = number_in)
this%listsize = 1
else
! reallocate -> add entry
this%all_numbers = [ this%all_numbers, number_in ]
this%listsize = SIZE (this%all_numbers)
end if
end subroutine add
end module realloc_test
program testprog
use realloc_test
implicit none
integer :: i
type(number_t) :: one, two, three, four
type(number_container) :: number_list
one = number_t ('one', 1)
two = number_t ('two', 2)
three = number_t ('three', 3)
four = number_t ('four', 4)
call number_list%add(one)
call number_list%add(two)
call number_list%add(three)
call number_list%add(four)
do i = 1, number_list%listsize
print*, number_list%all_numbers(i)%number_c
print*, number_list%all_numbers(i)%number_i
end do
end program testprog
Я скомпилировал с помощью ifort, используя
-assume realloc_lhs
для включения автоматического перераспределения. Вывод гласит:
1
??n
2
3
four
4
Последняя запись отображается правильно. Копирование старой части массива, по-видимому, вызывает проблемы с выделяемым компонентом. Когда я использую фиксированную длину символа, у меня не возникает проблем. Что именно происходит, когда автоматическое перераспределение используется таким образом? Есть ли другие варианты сделать это более безопасно?