Я хочу создать переменную производного типа (она же структура или определяемая пользователем переменная), вычислить ее в одной подпрограмме и использовать в другой подпрограмме. Оба компонента структуры являются размещаемыми массивами. Я хочу знать, как сообщить подпрограммам размер этих массивов. Единственный способ, которым я знаю, как это сделать с производным типом, - это выделение, но я могу выделить его только один раз. Распределяемые массивы непроизводного типа объявляются определенного размера в начале подпрограммы и в интерфейсе:
double precision, intent(in) :: anotherINP(n,m)
Но как мне это сделать для массивов производных типов?
Дополнительные подробности на случай, если они будут полезны: у меня есть модуль:
module my_type_module
type :: MyDataType
logical, allocatable :: horizjump(:,:)
integer, allocatable :: value(:,:)
end type
end module
и основной код, и подпрограммы используют его и определяют мою переменную, используя новый тип:
use my_type_module
TYPE(MyDataType) :: HkeStruct
У меня также есть интерфейс, который я помещаю в начало основного кода:
interface
subroutine CalcHKE(HkeStruct, n, m, anotherINP)
use my_type_module
integer, intent(in):: n,m
double precision, intent(in) :: anotherINP(n,m)
TYPE(myDataType), intent(out) :: HkeStruct
end subroutine CalcHKE
subroutine UseHKE(HkeStruct, n,m, Outvars)
use my_type_module
integer, intent(in) :: n,m
double precision, intent(out) :: Outvars
TYPE(myDataType), intent(in) :: HkeStruct
end subroutine UseHKE
end interface
Я попытался выделить компоненты структурной переменной в основном коде.
allocate HkeStruct%horizjump(n,m), HkeStruct%value(n,m)
но затем столкнулся с проблемой, когда я запустил свой код с большими значениями n и m, когда он записывался в эту переменную (недопустимая запись, адрес находится в стеке 1). Поэтому я попытался выделить его в подпрограмме, которая его создала, что затем вызвало недопустимое чтение, когда другая подпрограмма попыталась его прочитать. (Хотя обе эти проблемы очевидны только в больших системах и при использовании valgrind.)
Я могу запустить код, передав компоненты структурной переменной второй подпрограмме как обычные переменные, а не всю структуру. "Но он должен уметь работать со структурной переменной!!"
size
иshape
. Если подпрограмме необходимо знать размеры переданных ей массивов (а подпрограммам это редко требуется), она может их вычислить. - person High Performance Mark   schedule 01.11.2016