무제한 다형성에 따라 문자열을 다른 유형의 데이터 유형으로 변환 할 수있는 루틴을 작성하려고합니다. 사용자는이 루틴을 호출하여 데이터를 저장할 변수를 전달하고 변수/인수 유형에 따라 변환을 정의하는 루틴을 호출합니다. 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의 기본 동작인지 알고 싶습니다. 또한이 루틴을 사용하여 단일 "클래스 (*)"더미 인수와 함께이 작업을 수행 할 수있는 방법이 있다면 참조 된 할당 가능 문자를 포함하여 다른 유형을 변환하십시오. 예를 들어 루틴 내부에서 할당을 강제 수행하는 방법이 있습니까?
귀하의 의견에 감사드립니다. 환호하는 유형 선택 (또는 준)에서 에두아르도
설명 주셔서 감사합니다. @IanH. 내가 만든 파생 된 유형 (문자열)을 사용할 가능성을 추가 하겠지만, 문자열을 사용할 가능성을 배제하고, 루틴에 인수로 전달되기 전에 할당되어야하는 관측치를 사용해야합니다. – Jauch