【问题标题】:How do I pass a fortran pointer to a subroutine?如何将 fortran 指针传递给子例程?
【发布时间】:2016-01-23 07:21:17
【问题描述】:

由于某种原因,我需要将 Fortran 指针传递给子例程。子程序在一个模块中,主程序使用这个模块来保证显式接口。

我的问题是,为了接收传入的指针,我应该在子例程的虚拟参数上指定什么属性?

我尝试了下面的代码。

module aaa

contains

integer*4 function print_ptr_arr_1( ptr )

    implicit none

    integer*4, intent(in), pointer :: ptr(:)

    print *, 'as pointer'
    print *, size(ptr)
    print '(10i3)', ptr
    print *

end function print_ptr_arr_1

integer*4 function print_ptr_arr_2( ptr )

    implicit none

    integer*4, intent(in), target :: ptr(:)

    print *, 'as target'
    print *, size(ptr)
    print '(10i3)', ptr
    print *

end function print_ptr_arr_2

integer*4 function print_ptr_arr_3( ptr )

    implicit none

    integer*4, intent(in) :: ptr(:)

    print *, 'as assumed shape array'
    print *, size(ptr)
    print '(10i3)', ptr
    print *

end function print_ptr_arr_3

end module aaa

program main

    use aaa

    implicit none

    integer*4 :: i1, ierr
    integer*4, target  :: arr(10)
    integer*4, pointer :: ptr_arr(:)

    do i1 = 1, 10
        arr(i1) = i1
    end do

    ptr_arr => arr

    ierr = print_ptr_arr_1( ptr_arr )
    ierr = print_ptr_arr_2( ptr_arr )
    ierr = print_ptr_arr_3( ptr_arr )

    nullify( ptr_arr )

end program main

模块 aaa 中的三个子程序显示正确的输出如下。

sj2734@sonaram:~/work/practice/fortran_pointer$ ./a.out 
 as pointer
          10
  1  2  3  4  5  6  7  8  9 10

 as target
          10
  1  2  3  4  5  6  7  8  9 10

 as assumed shape array
          10
  1  2  3  4  5  6  7  8  9 10

sj2734@sonaram:~/work/practice/fortran_pointer$

什么是正确的,什么是错误的?或者,这些都是正确的吗?

【问题讨论】:

    标签: pointers attributes fortran


    【解决方案1】:

    这取决于您将如何使用传递给函数的内容。你需要它作为指针吗?然后给它pointer 属性。你需要在函数中用另一个指针指向它吗?然后,给它target 属性。虚拟参数将采用您赋予它的任何属性。

    如果您将其声明为pointer,那么您可以将其用作指针并分配/指向函数内的新事物。

    如果你将它声明为target,那么函数中的其他指针可以指向它,但你不能用它指向target,因为它不是指针。

    如果你只是想把它当作一个数组,那么你可以把它声明为一个假定大小的数组,然后把它当作一个普通数组来对待,但是你不能再像使用它一样使用它了它具有pointertarget 属性。

    所以在某种程度上,它们都很好。这取决于上下文。但是,除非您出于特定原因确实需要将其作为指针或目标,并且您只是将其视为数组,否则最好将其声明为假定大小的数组以避免潜在的内存问题。

    【讨论】:

    • 非常感谢。它帮助很大。
    猜你喜欢
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    相关资源
    最近更新 更多