Я не очень хороший программист, и я просто пытаюсь взаимодействовать с моделью, которая предоставляет данные в качестве указателей. Эти указатели передаются через несколько подпрограмм перед их записью. Я не уверен, как это сделать, чтобы избежать утечек памяти.Правильный способ передать указатели на многие подпрограммы
Предположим, у меня есть указатель на массив A
, который передается нескольким подпрограммам перед записью, как обрабатывать объявления, распределения и освобождения?
module data
implicit none
contains
subroutine s1(a)
real, pointer, intent(out) :: a(5,5)
call s2(a)
end subroutine s1
subroutine s2(a)
real, pointer, intent(out) :: a(5,5)
integer :: i
do i = 1,5
a(:,i) = 5.0
end do
end subroutine s2
end module data
Program test
use data, only : s1, s2
real, pointer, dimension(:,:) :: A => NULL()
allocate(A(5,5))
call s1(A)
write(*,*) A
deallocate(A)
end Program test
Я не совсем уверен, что вы просите, но если у вас есть проблемы с кодом это скорее всего связано с 'умыслом (из)' атрибута этих указателей. См. Например, [этот связанный вопрос] (https://stackoverflow.com/q/29737367). Или так называемая _explicit shape_ nature (которая конфликтует с указателем). – francescalus
Вам нужно указать размер только один раз. В подпрограммах вы должны объявить как: 'real, pointer, dimension (:, :), intent (out) :: a'. После 'deallocate (A)', если вам больше не нужен указатель, вы можете «аннулировать (A)» –