2016-11-17 1 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

이 코드는 포트란 아님을 유의하시기 바랍니다 (90)

포트란 2003

에 도입 된 포인터 더미 (공식) 인수에 대한 intent 속성 intent 포인터의 연결 상태를 말합니다, 그것의 표적에 아닙니다. 또한 인수가 포인터 구성 요소가있는 파생 형식 인 경우 intent은 포인터의 대상이 아닌 형식 개체 자체에 적용됩니다.

는 앞의 예와 같은 경우에 필요하지 비록
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(in)이 사용됩니다 경우 즉, 포인터가 변경 될 수를 대상으로하는 데이터 영역입니다 상태 변경 intent(inout)을 사용하여 데이터 수정이 수행되고 있음을 독자에게 나타냅니다.

다른 주에

, 당신은 당신이 요구하는 것을 완전히 잘 모르겠지만, 당신은 당신의 코드에 문제가있는 경우는 가능성이 '의도 (교체 아웃)'속성에 관련이 도움이 대답 Fortran subroutine returning wrong values

+0

"나는 아주 좋은 프로그래머가 아닙니다."라는 문장은 포인터를 사용하고 싶지 않습니다. 심지어 훌륭한 프로그래머조차도 다양한 이유 때문에 포인터를 피하는 경우가 종종 있습니다. 제공된 코드의 포인터를 사용하려는 이유를 알기가 어렵습니다. 나는 포인터의 사용이 흥미로운 질문이지만 포인터가 필요한지 아닌지 다시 생각할 것이다. – Holmz

관련 문제