2

繰り返しますが、Fortran のポインターの配列です。さて、私は派生型を持っています:

type :: t_context_pointer  
    type(t_context),pointer :: p_ctx  
end type t_context_pointer

メインプログラムで行う場合:

type(t_context_pointer),allocatable :: tab_ctx_ptr(:)  
type(t_context),allocatable,target :: ctx  
allocate(tab_ctx_ptr(1))  
allocate(ctx)  
tab_ctx_ptr(1)%p_ctx=>ctx

できます。しかし、関数呼び出しを使用すると:

type(t_context_pointer),allocatable,target :: tab_ctx_ptr(:)
allocate(tab_ctx_ptr(n))
call alloc_ctx(tab_ctx_ptr,n,1)

他の場所で:

subroutine alloc_ctx(tab_ctx_ptr,n,i)
    integer,intent(in) :: n,i
    type(t_context_pointer),intent(inout) :: tab_ctx_ptr(n)

    type(t_context),allocatable,target :: ctx

    allocate(ctx)
    tab_ctx_ptr(i)%p_ctx=>ctx
end subroutine

コードの後半で seg_fault します。ここで何か問題がありますか?

4

1 に答える 1

4

ctxサブルーチンのスコープ内にあり、サブルーチンalloc_ctxを離れるとすぐに割り当てが解除されます。後で (ポインターを使用して) アクセスすると、segfault が発生します。

最初の例では、メイン プログラムで割り当てctxているため、そのスコープはプログラムの最後までになります。

なぜあなたはallocate tab_ctx_ptr(i)%p_ctx直接しないのですか:

subroutine alloc_ctx(tab_ctx_ptr,n,i)
    integer,intent(in) :: n,i
    type(t_context_pointer),intent(inout) :: tab_ctx_ptr(n)

    allocate(tab_ctx_ptr(i)%p_ctx)
end subroutine

割り当て解除について: 次のようなものを使用して、すべてのポインターの割り当てを解除できます (ただし、配列自体は解除できません)。

subroutine dealloc_ctx(tab_ctx_ptr,n)
    integer,intent(in) :: n
    type(t_context_pointer),intent(inout) :: tab_ctx_ptr(n)
    integer            :: i

    do i=1,n
      ! Check whether the current element has an allocated element and 
      ! deallocate if necessary. 
      if ( associated(tab_ctx_ptr(i)%p_ctx) ) deallocate(tab_ctx_ptr(i)%p_ctx)
    enddo ! i
end subroutine
于 2013-10-16T09:46:16.913 に答える