2016-11-17 4 views
0

私は非常に優れたプログラマーではなく、データをポインタとして提供するモデルとのインターフェースをとろうとしています。これらのポインタは、データが書き込まれる前にいくつかのサブルーチンに渡されます。私はメモリリークを避けるためにこれを行う方法がわかりません。多くのサブルーチンにポインタを渡す適切な方法

アレイポインタAが書き込まれる前にいくつかのサブルーチンに渡されているとします。宣言、割り当て、および割り当てをどのように処理しますか?

module data 

implicit none 
contains 

subroutine s1(a) 
real, pointer, intent(out) :: a(5,5) 

call s2(a) 
end subroutine s1 

subroutine s2(a) 
real, pointer, intent(out) :: a(5,5) 
integer :: i 

do i = 1,5 
    a(:,i) = 5.0 
end do 
end subroutine s2 
end module data 

Program test 
use data, only : s1, s2 
real, pointer, dimension(:,:) :: A => NULL() 
allocate(A(5,5)) 
call s1(A) 
write(*,*) A 
deallocate(A) 
end Program test 
+1

を見つけることが私はあなたが求めているものを全くわからないんだけど、あなたのコードに問題がある場合、それはおそらく '意図(アウト)'属性に関連していますそれらのポインタの。たとえば、[この関連する質問](https://stackoverflow.com/q/29737367)を参照してください。または、いわゆる_explicit shape_nature(ポインタと競合する)。 – francescalus

+1

ディメンションは一度だけ指定する必要があります。サブルーチンでは、次のように宣言する必要があります。 'real、pointer、dimension(:, :)、intent(out):: a' '' deallocate(A) 'の後にポインタを必要としなくなった場合、' 'nullify(A)' 'を実行することができます。 –

答えて

1

はあなたのコードは、Fortranではないことに注意してください90.

のFortran 2003

に導入されたポインタであるダミー(正式な)引数の intent属性 intentは、ポインタの結合状態を指し、その目標にはならない。また、引数が ポインタコンポーネントを持つ派生型である場合、 intentはポインタのターゲットではなく型オブジェクト自体に適用されます。つまり、ポインタがに標的化されること、例えば、 intent(in)が使用される場合など、データ領域では変更することができる。

module MyType_mod 

    implicit none 
    private 

    type, public :: MyType 
    integer, pointer :: ptr(:) 
    contains 
    procedure :: sub => my_type_sub 
    end type MyType 

contains 

    subroutine my_type_sub(self) 
    ! Dummy argument 
    class(MyType), intent(in) :: self 

    ! The following is perfectly legal, 
    ! even though intent(in) was specified 
    self%ptr = 42 

    end subroutine my_type_sub 

end module MyType_mod 

program main 

    use MyType_mod, only: & 
     MyType 

    implicit none 

    type(MyType) :: foo 
    integer  :: alloc_stat 

    allocate(integer :: foo%ptr(100), stat=alloc_stat) 
    call foo%sub() 

end program main 

必要ないにもかかわらず、そのような前の例とする場合には、に優れています状態intent(inout)を使用して、データの変更が行われていることを読者に示します。別のノートで

、あなたがこの回答に有用Fortran subroutine returning wrong values

+0

"私は非常に良いプログラマではありません "というステートメントは、そして、本当に良いプログラマでさえ、いろいろな理由でポインタを避けることがよくあります。なぜ、提供されたコードからポインタを使用したいのか分かりません。ポインタの使用が興味深い質問であっても、ポインタが必要かどうかを再考したいと思います。 – Holmz

関連する問題