2012-08-10 4 views
3

일부 Fortran 95 코드에는 포인터 필드가있는 유형이 있습니다. 컴파일시에 초기화되는 type(foo)이라는 모듈 변수를 선언하고 싶습니다. 다음과 같은 내용 :fortran에서 유형 생성자에 포인터를 사용할 수 있습니까?

module foo_module 
    implicit none 
    type foo_type 
    integer :: x 
    logical, pointer :: x_flag => null() 
    end type foo_type 

    logical, target :: bar_flag 
    ! this does not compile of course: 
    type(foo_type) :: bar = foo_type(1, bar_flag) 
end module foo_module 

위의 스 니펫은 컴파일되지 않습니다.

module foo_module 
    implicit none 
    type foo_type 
    integer :: x 
    logical, pointer :: x_flag => null() 
    end type foo_type 

    logical, target :: bar_flag 
    type(foo_type) :: bar 
contains 
    subroutine init() 
    bar%x = 1 
    bar%x_flag => bar_flag 
    end subroutine init 
end module foo_module 

하지만 초기화 서브 루틴없이이 작업을 수행 할 수 있습니다 : 나는 같은 별도의 서브 루틴을 사용하여 런타임에 bar을 초기화 할 수 있음을 이해? 아니면 컴파일러에 의해 명시 적으로 호출되는 초기화 서브 루틴을 선언 할 수 있습니까? 참고 : Fortran 95에서이 작업을 수행해야합니다.

답변

6

초기화 코드 (예제 코드의 첫 번째 블록에서 bar 선언에있는 equals 뒤에 나오는 것)는 초기화 (상수) 표현식이어야합니다. Fortran 95의 초기화 표현식에 대한 규칙은 구조 생성자에서 NULL() 이외의 포인터 대상을 허용하지 않습니다.

는 (이 규칙은 저장 속성을 변수로 초기화 식의 구조 생성자에서 포인터 목표를 허용하는 포트란 2008 년에 완화되었다.) 당신의 초기화 서브 루틴이 대신 할당의 구조 생성자를 사용할 수

주 개별 구성 요소. 모듈을 사용하는 클라이언트 코드는 구조체 생성자 인 bar = foo_type(1, bar_flag)을 사용하여 bar에 할당을 직접 실행할 수도 있습니다. 이 문제는 구조체 생성자에서 포인터 대상을 사용하는 것이 아닙니다. 즉 구조체 생성자의 포인터 대상이 인 초기화 표현이어야합니다.

파생 된 유형에 대해 초기화 절차를 선언 할 수 없습니다. (Fortran 2003에서는 구조체 생성자를 대체하는 함수를 사용할 수 있지만 이러한 함수는 초기화 표현식에서 사용할 수 없습니다.)

+0

훌륭한 설명에 감사드립니다. Fortran 95 언어 하위 집합으로 제한되는 것은 정말 짜증납니다. ( – abbot