Попытка передать секцию выделяемого массива в качестве аргумента подпрограммы - PullRequest
0 голосов
/ 03 декабря 2018

Я хочу передать часть выделяемого массива в подпрограмму.Исходный массив имеет три индекса.Подпрограмма ожидает массив с двумя индексами.Допустим, я хочу оперировать пятым индексом исходного массива.Я делаю что-то вроде этого, но попадаюсь на последнюю строку:

module lots_of_stuff
...
contains
subroutine process_points(points)
integer, allocatable, intent(inout) :: points(:,:)
! do stuff
end subroutine
end module

program foo
use lots_of_stuff
integer, allocatable :: inpoints(:,:,:)
integer :: lim1, lim2, lim3
! figure out how big inpoints should be (i.e. set lim1, lim2, lim3)  then ...
allocate(inpoints(lim1,lim2,lim3)
! populate inpoints then ...
call process_points(????)

Допустим, я хочу обработать элементы в пятом разделе точек.Если я попытаюсь

call process_points(inpoints(:,:,5))

GNU Fortran скажет мне

Error: Actual argument for ‘badpts’ must be ALLOCATABLE at (1)

Если я попытаюсь

call process_points(inpoints(1,1,5))

GNU Fortran скажет мне

Error: Rank mismatch in argument ‘badpts’ at (1) (rank-2 and scalar)

Я думаю, я мог бы скопировать inpoints(:,:,5) в массив с двумя индексами и отправить его в process_points, но это выглядит не элегантно.Есть ли способ сделать то, что я пытаюсь сделать?

1 Ответ

0 голосов
/ 03 декабря 2018

Вы не должны делать фиктивный аргумент внутри process_points(:) перераспределяемым, если только вы не хотите освободить его или выделить.Или, если вы хотите сохранить нижнюю границу посредством вызова, но тогда ваш фактический аргумент должен быть размещаемым.

Подмассив никогда не может быть размещен, даже если он является подмассивом размещаемого массива.Таким образом, вы никогда не должны передавать вложенный массив подпрограмме, которая требует выделяемого аргумента.

Поэтому я бы просто удалил атрибут allocatable в подпрограмме.

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