2014-12-29 10 views
1

무제한 다형성에 따라 문자열을 다른 유형의 데이터 유형으로 변환 할 수있는 루틴을 작성하려고합니다. 사용자는이 루틴을 호출하여 데이터를 저장할 변수를 전달하고 변수/인수 유형에 따라 변환을 정의하는 루틴을 호출합니다. Fortran에서 무제한 다형성 더미 인수가있는 서브 루틴에 할당 가능 문자 전달

이 루틴의 발췌

은 여기에 있습니다 :

subroutine GetAsScalar (this, value, status) 
    !Arguments------------------------------------------------------------- 
    class(TKeyword)         :: this 
    class(*)          :: value 
    logical, optional        :: status 

    !Local----------------------------------------------------------------- 
    integer           :: stat   

    !---------------------------------------------------------------------- 

    stat = 0 

    select type (value) 
    type is (REAL(real32))  !single precision 
     read (this%fValue, *, IOSTAT = stat) value   
    type is (REAL(real64))  !double precision 
     read (this%fValue, *, IOSTAT = stat) value 
    type is (LOGICAL) 
     read (this%fValue, *, IOSTAT = stat) value 
    type is (INTEGER(int32)) !integer 
     read (this%fValue, *, IOSTAT = stat) value 
    type is (INTEGER(int64)) !long integer 
     read (this%fValue, *, IOSTAT = stat) value 
    type is (CHARACTER(*)) 
     value = this%fValue 
    class default    
     this%Message = "Invalid data type" 
     status = .false. 
     return 
    end select 

    if (present (status)) then 
     if (stat /= 0) then 
      status = .false. 
     else      
      status = .true. 
     endif 
    endif 

end subroutine GetAsScalar 

"이 %의 fValue"는 "문자 (LEN = :), 할당 가능한"문자열입니다. 내가 할당 가능한 문자열을 전달이 루틴을 사용하려고하면 은 성공 그 출구는 오류가/예외는 인상하지 :

character(len=:), allocatable :: value 
call keyword%GetAsScalar(value) 

그러나 문자열 "값이"항상 비어 있습니다. 루틴 내에서도 "value = this % fValue"를 할당 한 후 값이 비어 있습니다 (len (값)는 0 임).

컴파일러가 인수가 문자 (len = :), 할당 가능 유형임을 감지 할 수 없어서 값을 할당 할 수없는 것으로 보입니다.

물론 나는 몇 가지 대안이 있지만, 단일 루틴을 사용할 수 있고 다른 종류의 데이터에 대해 선택적 인수를 사용할 수 없다는 아이디어가 정말 좋습니다.

문자열을 처리하기 위해 내가 만든 사용자 정의 형식을 사용할 수 있습니다.

그러나 이것이 포트란 2008의 기본 동작인지 알고 싶습니다. 또한이 루틴을 사용하여 단일 "클래스 (*)"더미 인수와 함께이 작업을 수행 할 수있는 방법이 있다면 참조 된 할당 가능 문자를 포함하여 다른 유형을 변환하십시오. 예를 들어 루틴 내부에서 할당을 강제 수행하는 방법이 있습니까?

귀하의 의견에 감사드립니다. 환호하는 유형 선택 (또는 준)에서 에두아르도

답변

4

관계없이 선택하는 속성을 가지고 있는지 여부, 상기 준 이름 절대 할당 가능한 속성 (16.5.1.6p2)를 갖고 구성.

귀하의 경우 선택기에도 해당 속성이 없습니다. value 임시 인수가 할당 가능으로 선언되지 않았습니다. 할당되지 않은 실제 인수를 할당 가능하지 않은 임시 인수와 연관시킬 수 없습니다. 그 외에도 선택 유형이나 연관 구조에서 할당되지 않은 선택자를 사용할 수 없습니다.

value 실제 인수를 호출하기 전에 길이를 할당해야합니다. 그러면 value 연관 이름은 선택 유형 구성 안에 고정 된 길이가됩니다. 또는 할당 가능한 문자 변수를 파생 된 유형의 구성 요소로 래핑하십시오.

+0

설명 주셔서 감사합니다. @IanH. 내가 만든 파생 된 유형 (문자열)을 사용할 가능성을 추가 하겠지만, 문자열을 사용할 가능성을 배제하고, 루틴에 인수로 전달되기 전에 할당되어야하는 관측치를 사용해야합니다. – Jauch