maxval how example create array allocatable vector fortran dynamic-allocation

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.