Meine Praxis ist es, eine Funktion zurückzukehren, wenn die Funktion nur eine Variable ändert und keine andere Ausgabe macht. Wenn mehrere Variablen geändert werden oder die Prozedur andere Aktionen ausführt, würde ich die Ausgabevariablen in die Argumentliste einfügen. Dies ist eine Stilwahl. Es ist möglich, Speicherverluste mit Zeigern zu erzeugen, insbesondere mit Zeigern, die als Funktionsargumente zurückgegeben werden, so dass ich diese Option vermeiden würde, wenn es keinen zwingenden Grund in dem speziellen Fall gibt.
UPDATE: Es gibt kein Problem mit der Absicht (out) Array-Argument ... müssen keine Annahmen über die Größe des Arrays hergestellt werden, wie das folgende Beispiel zeigt:
module example_one
implicit none
contains
subroutine two_arrays (in_arr, out_arr)
integer, dimension (:), intent (in) :: in_arr
integer, dimension (:), allocatable, intent (out) :: out_arr
integer :: i, len
len = size (in_arr)
allocate (out_arr (1:len))
do i=1, len
out_arr (i) = 3 * in_arr (i)
end do
return
end subroutine two_arrays
end module example_one
program test
use example_one
implicit none
integer, dimension (1:5) :: in_arr = [ 1, 2, 4, 5, 10 ]
integer, dimension (:), allocatable :: out_arr
write (*, *) allocated (out_arr)
call two_arrays (in_arr, out_arr)
write (*, *) size (out_arr)
write (*, *) out_arr
write (*, *) allocated (out_arr)
deallocate (out_arr)
write (*, *) allocated (out_arr)
stop
end program test
Gibt es Probleme wie Stapelabstürze, wenn Sie mit den verschiedenen Strategien zurückkehren? Angenommen, Sie geben ein Array von 1 Million Real zurück. Überlaufen Sie den Stapel und wird er vom Funktionskontext in den Aufruferkontext kopiert? –