vector - how - integer allocatable fortran
Fortran array crece automáticamente al agregar un valor (1)
¿Existe alguna forma de emular el crecimiento de la matriz en Fortran? Como vector en C ++. Me sorprendió mucho cuando no encontré nada sobre este tema en Internet.
Como ejemplo de motivación, supongamos que calculo alguna relación de recurrencia y quiero almacenar todos los números intermedios que obtengo. Mi criterio de detención es la diferencia entre los resultados adyacentes, por lo que no puedo saber de antemano cuánta memoria debo asignar para esto.
Estoy seguro de que se ha mostrado en algún lugar de este sitio antes, pero no puedo encontrarlo.
Primero, en Fortran 2003, puede agregar un elemento por simple
a = [a, item]
como lo comentó francescalus. Es probable que reasigne la matriz muy a menudo y será lenta.
Puede mantener su matriz asignada a un tamaño algo mayor que su número de elementos n
. Cuando su número de elementos n
crece por encima del tamaño del tamaño de la matriz size(a)
, puede asignar una nueva matriz más grande por algún factor (aquí 2x) y copiar allí los elementos antiguos. No hay realloc()
en Fortran, desafortunadamente.
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
Olvidé la asignación inicial, es bastante simple.
Todo se puede poner en un tipo derivado con procedimientos de tipo ligado, y usarlo como una estructura de datos, pero eso es puro Fortran 2003 y tú querías 90. Así que te explico Fortran 95, porque Fortran 90 tiene fallas de muchas maneras para asignarlo arrays y está desesperadamente obsoleto y esencialmente muerto.