2012-06-25 2 views
1

파생 형 t_file 파이널 라이 제이션 루틴 close을 사용하여 "Finalization"을 화면에 씁니다. t_file 유형의 인스턴스를 반환하는 함수가 있습니다.함수 리턴 값의 조기 파이널 라이즈

  • 왜 마무리가Just opened 출력 전에 발생 않습니다 이 프로그램의 출력은 내가이 개 질문이

    Finalization. 
    Finalization. 
    Just opened 
        2000 
    Done. 
    

    입니까?

  • 왜 완료가 발생합니까 두 번?

제 컴파일러는 Intel (R) Visual Fortran Composer XE 2011 12.1.3526.2010입니다.

module m_file 
    implicit none 


    type t_file 
     integer::iu=1000 

     contains 

     final::close 
    end type 

    contains 

    function openFile() result(f) 
     implicit none 

     type(t_file)::f 

     f%iu = 2000 

    end function 

    subroutine close(this) 
     implicit none 

     type(t_file)::this 

     write(*,*) 'Finalization.' 

    end subroutine 

end module 

program foo 
    use m_file 
    implicit none 

    type(t_file)::f 

    f = openFile() 
    write(*,*) 'Just opened' 
    write(*,*) f%iu 

    write(*,*) 'Done.'  
    read(*,*) 

end program 

답변

5

이 문제가 너무 놀랐 : 여기

는 코드입니다. 필자는 Fortran의 새로운 (OE) 기능에 익숙해졌지만 아직 최종 절차를 작성할 필요가 없습니다. 저는이 행동에 대해 일종의 설명을 해줄 수 있다고 생각합니다. Modern Fortran Explained 저자의 p282에

작성 :

을 마무리가 객체 (할당 해제 또는 return 문의 실행으로되어 , 예를 들어)이 존재하지 않게하려고 할 때, 최종 서브 루틴입니다 객체를 실제 인수로 호출합니다. 이 은 개체가 의도 된 out 더미 인수로 전달되거나 내재적 인 지정 문 왼쪽에있는 변수 일 때도 발생합니다. 후자의 경우, 최종 서브 루틴은 이고, 오른쪽의 표현식은 이 평가되었지만 변수에 지정되기 전에 호출됩니다.

이 단락에서 언급 한 두 가지 경우 모두를 치는 것처럼 보입니다. 함수 openFile 안에있는 f이라는 엔티티가 해당 함수에서 반환 될 때 범위를 벗어나려고 할 때 첫 번째 Finalization을 얻습니다. 프로그램 범위의 변수 f좌 할당 f = openFile()에 사용하는 경우

당신은 두 번째 Finalization를 얻을.

이 모든 것에서 나는 프로그램 범위에서 f의 조기 종료를 보지 못하고 있지만 미묘하게 다른 것을 결론 내리고 있습니다.

나는이 일이 무엇인지 완전히 확신하지 못하고 있으며, 언어의 행동이 그대로 있어야하는 데는 충분한 이유가 있다고 생각하지 않습니다. 저는 약간 놀랐습니다. 프로그램을 끝내고 f이 범위를 벗어나면 세번째 Finalization 메시지를 얻지 못했습니다.

실제 Fortran 전문가는 곧 다가와 우리 모두를 계몽 할 것입니다.

+1

귀하의 설명이 매우 좋다고 생각합니다. 나는 또한 세 번째 것을 기대할 것이다. 제 생각에는 모든 경우에 필요할 수도 있으므로 디자인이 논리적이라고 생각합니다. –

+0

불행히도 파이널 라이 제이션이 나를 위해 파일 단위를 닫고 싶었 기 때문에 사용하기 전에 장치를 닫는 동작이있었습니다. 나는 최종 결정없이 간단하게 할 수 있다고 생각합니다. – bdforbes

+0

또 다른 메모에서 전체 프로그램의 다른 부분에서는 실제로 제대로 작동하고 조기에 완료되지 않았습니다. 나는 아직 그것을 예증 할 수 없었다. – bdforbes

0

하이 퍼포먼스 마크가 제공하는 답변에 대한 보조 수정 : 첫 번째 종료는 실제로 프로그램 범위의 변수 f입니다. 이것은 단순히 최종 루틴에이 % iu를 인쇄하고 프로그램 범위에서 f % iu를 임의의 값으로 설정하여 볼 수 있습니다.