返回数组策略比较

时间:2011-01-05 11:25:15

标签: fortran fortran90

在Fortran中,我可以使用三种方法从子例程返回数组。第一个是通过intent(out)参数。第二个是通过一个函数,数组为result。第三个是使函数具有result指向数组的指针,该指针在函数中分配。

每种方法有哪些优点和缺点?

2 个答案:

答案 0 :(得分:5)

我的做法是在函数只改变一个变量而不进行其他输出时使用函数返回。如果更改了多个变量或者过程执行了其他操作,我会将输出变量放在参数列表中。这是一种风格选择。使用指针创建内存泄漏是可能的,特别是将指针作为函数参数返回,所以除非在特定情况下有令人信服的理由,否则我会避免使用此选项。

更新:intent(out)数组参数没有问题......不需要对数组的大小做任何假设,如下例所示:

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 :(得分:0)

  1. `intent(out)`可能是一个问题,因为你必须对传入的数组的大小做出假设。
  2. 返回数组也是一个问题,因为接收代码必须对返回的数组的大小做出假设
  3. 指向数组的指针存在与大小相关的问题以及对指针是否关联进行假设的问题。
  4. 另一种方法是创建一个模块,在该模块中有一个类型,它包含一个可分配的数组和一个详细说明数组大小的整数:
  5. module mymodule
        type myvector
            double precision,allocatable::values(:)
            integer::length
        end type
    end module
    

    然后你的功能可以是:

    function myvecreturner(someparam)
        use mymodule
        type(myvector)::myvecreturner
        integer::someparam
    
        allocate(myvecreturner%values(someparam))
        myvecreturner%length = someparam
    end function
    

    你可以愉快地传递这些myvector类型。只需记住在完成数组时解除分配数组......