Я уверен, что это было показано где-то на этом сайте раньше, но я не могу найти его.
Во-первых, в Fortran 2003 вы можете добавить один элемент простым
a = [a, item]
как прокомментировал francescalus. Это может привести к перераспределению массива очень часто и будет медленным.
Вы можете сохранить свой массив для выделения несколько большего размера, чем ваше количество элементов n
. Когда количество ваших элементов n
превысит размер массива size(a)
, вы можете выделить новый массив в несколько раз больше (здесь в 2 раза) и скопировать туда старые элементы. К сожалению, в Фортране нет realloc()
.
module growing_array
implicit none
real, allocatable :: a(:)
integer :: n
contains
subroutine add_item(item)
real, allocatable :: tmp(:)
real, intent(in) :: item
if (n == size(a)) then
!this statement is F2003, it can be avoided, but I don't see why in 2016
call move_alloc(a, tmp)
allocate(a(n*2))
a(1:n) = tmp
end if
n = n + 1
a(n) = item
end subroutine
end module
Я пропустил начальное распределение, оно достаточно простое.
Все это можно поместить в производный тип с процедурами, связанными с типом, и использовать его как структуру данных, но это чистый Фортран 2003, а вы хотели 90. Итак, я показываю Фортран 95, потому что Фортран 90 во многих отношениях несовершенен для размещения массивов и безнадежно устарел и по существу мертв.
person
Vladimir F
schedule
04.08.2016
a=[a,5]
не является F90. (Или эффективно.) - person francescalus   schedule 04.08.2016a=[a,5]
— простой пример того, что можно сделать легко, но что будет медленно. - person Vladimir F   schedule 04.08.2016