2016-01-23 71 views
1

由於某種原因,我需要將Fortran指針傳遞給子例程。子程序在模塊內,主程序使用該模塊來確保顯式接口。如何將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顯示正確的輸出。

[email protected]:~/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 

[email protected]:~/work/practice/fortran_pointer$ 

什麼是正確的?哪些不正確?或者,這些都正確嗎?

回答

2

這取決於你將如何使用你傳遞給函數的內容。你需要它是一個指針嗎?然後給它pointer屬性。你需要用函數中的另一個指針指向它嗎?然後,給它target屬性。虛擬參數將承擔您提供的任何屬性。

如果你聲明它爲pointer那麼你可以用它作爲指針並在函數內分配/指向新的東西。

如果你聲明它爲target,那麼函數中的其他指針可能指向它,但由於它不是指針,所以你不能指向它,因爲它不能指向target

如果你只是想把它當作一個數組來處理,那麼你可以將它聲明爲一個假定大小的數組,然後像普通數組一樣對待它,但是同樣你也不能像如果它具有pointertarget屬性。

所以他們沒事,在某種程度上。這取決於上下文。然而,除非你真的需要它是一個指針或目標出於特定的原因,並且你只是將它當作一個數組來處理,那麼你最好將它聲明爲假設大小的數組以避免潛在的內存問題。

+0

非常感謝。它幫助了很多。 – user79973