Как передать размер выделяемой определяемой пользователем переменной (производного типа, структуры данных) подпрограмме в фортране?

Я хочу создать переменную производного типа (она же структура или определяемая пользователем переменная), вычислить ее в одной подпрограмме и использовать в другой подпрограмме. Оба компонента структуры являются размещаемыми массивами. Я хочу знать, как сообщить подпрограммам размер этих массивов. Единственный способ, которым я знаю, как это сделать с производным типом, - это выделение, но я могу выделить его только один раз. Распределяемые массивы непроизводного типа объявляются определенного размера в начале подпрограммы и в интерфейсе:

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.)

Я могу запустить код, передав компоненты структурной переменной второй подпрограмме как обычные переменные, а не всю структуру. "Но он должен уметь работать со структурной переменной!!"


comment
затем столкнулся с проблемой, когда запустил свой код с большими значениями n и m Вам придется показать код и точные сообщения об ошибках, чтобы получить какие-либо полезные ответы или предложения. Пока я придираюсь - в Фортране массивы "знают" свои собственные размеры, и для их определения есть встроенные процедуры, такие как size и shape. Если подпрограмме необходимо знать размеры переданных ей массивов (а подпрограммам это редко требуется), она может их вычислить.   -  person High Performance Mark    schedule 01.11.2016
comment
Кроме того, интерфейсы, написанные программистом, такие как вы показываете в своем вопросе, редко необходимы, когда вы пишете современный Фортран с модулями и т.п. Мне непонятно, для чего, по вашему мнению, они вам нужны.   -  person High Performance Mark    schedule 01.11.2016
comment
Интерфейсы особенно не нужны, когда используются модули. И вы, кажется, используете модули.   -  person Vladimir F    schedule 01.11.2016
comment
Спасибо всем за ваши ответы ... Я слышал, что ответ на мой вопрос заключается в том, что мне не нужно сообщать подпрограмме размер моей выделяемой структуры данных производного типа, поэтому что-то еще должно быть не так. Я отредактирую свой вопрос, чтобы показать код и ошибки, которые я получаю.   -  person Emily    schedule 04.11.2016


Ответы (1)


Чтобы получить размер:

n = size(HkeStruct%horizjump, dim=1)
m = size(HkeStruct%horizjump, dim=2)

Это работает для размещаемых массивов, передаваемых с предполагаемой формой или в производных типах.

Ошибки, которые у вас есть, могут быть связаны с режимом выделения вашего компилятора. Посмотрите http://jblevins.org/log/segfault или http://people.sc.fsu.edu/~jburkardt/f_src/memory_test/memory_test.html например.

person Pierre de Buyl    schedule 01.11.2016