Передача размещаемого символа в подпрограмму с неограниченным полиморфным фиктивным аргументом в Фортране
Я пытаюсь написать подпрограмму, которая может преобразовывать строку в различные типы данных, основываясь на неограниченном полиморфизме. Идея состоит в том, чтобы пользователь вызывал эту подпрограмму, передавая переменную, в которой он хочет хранить данные, и подпрограмму для определения преобразования на основе типа переменной / аргумента.
Выдержка из этой процедуры здесь:
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
«this% fValue» является строкой «символов (len = :), размещаемой». Когда я пытаюсь использовать эту подпрограмму, передавая размещаемую строку, она завершается с успехом, без ошибок / исключений:
character(len=:), allocatable :: value
call keyword%GetAsScalar(value)
Но строка «значение» всегда пуста. Даже внутри процедуры после присваивания «value = this% fValue» значение остается пустым (len (value) равно 0).
Похоже, что компилятор не может обнаружить, что аргумент имеет тип символа (len = :), размещается и поэтому не может присвоить ему значение.
Конечно, у меня есть несколько альтернатив, но идея возможности использовать одну рутину без необязательных аргументов для разных типов данных действительно хороша.
Я могу использовать пользовательский тип, который я создаю, например, для обработки строк.
Но я хотел бы знать, является ли это поведением по умолчанию в Fortran 2008. А также, если есть способ сделать это, используя эту подпрограмму с единственным фиктивным аргументом "class (*)", для преобразования различных типов, включая именуемый выделяемый символ. Например, есть способ форсировать распределение внутри подпрограммы?
Я буду благодарен за ваши комментарии. Ура, Эдуардо