Thực hành của tôi là sử dụng hàm trả về khi hàm chỉ thay đổi một biến và không tạo ra kết quả nào khác. Nếu nhiều biến được thay đổi hoặc thủ tục thực hiện các hành động khác, tôi sẽ đặt các biến đầu ra trong danh sách đối số. Đây là một lựa chọn phong cách. Có thể tạo rò rỉ bộ nhớ bằng con trỏ, đặc biệt là với con trỏ được trả về dưới dạng đối số hàm, vì vậy tôi sẽ tránh tùy chọn này trừ khi có lý do thuyết phục trong trường hợp cụ thể.
UPDATE: Không có vấn đề với một ý định (ra) lập luận mảng ... không có giả định cần được thực hiện về kích thước của mảng, như ví dụ sau đây cho thấy:
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
Nguồn
2011-01-05 15:51:41
có vấn đề như ngăn xếp đống khi bạn quay trở lại với các chiến lược khác nhau? giả sử bạn trả về một mảng 1 triệu reals. bạn sẽ tràn ngăn xếp, và nó sẽ được sao chép từ ngữ cảnh chức năng đến ngữ cảnh của người gọi không? –