Моя практика заключается в использовании функции return, когда функция изменяет только одну переменную и не делает другого выхода. Если несколько переменных изменены или процедура выполняет другие действия, я бы поместил выходные переменные в список аргументов. Это выбор стиля. Можно создавать утечки памяти с указателями, особенно с указателями, возвращаемыми как аргументы функции, поэтому я бы избегал этой опции, если в конкретном случае не было убедительной причины.
UPDATE: Там нет никаких проблем с намерением (уходит) аргумент массива ... никаких предположений не нужно быть размером массива, как показано в следующем примере:
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
Есть ли проблемы, такие как сбои стека, когда вы возвращаетесь с помощью разных стратегий? предположим, что вы возвращаете массив из 1 миллиона реалов. вы переполните стек и скопируете ли он из контекста функции в контекст вызывающего? –