Passando um caractere alocável para uma sub-rotina com argumento fictício polimórfico ilimitado no Fortran
Estou tentando escrever uma rotina capaz de converter uma string em diferentes tipos de dados, com base no polimorfismo ilimitado. A idéia é que o usuário chame essa rotina, passando a variável onde deseja armazenar os dados e a rotina para definir a conversão com base no tipo de variável / argumento.
Um trecho desta rotina está aqui:
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" é um caractere "(len = :), alocável". Quando tento usar essa rotina passando uma string alocável, ela sai com êxito, sem erros / exceções:
character(len=:), allocatable :: value
call keyword%GetAsScalar(value)
Mas a cadeia "valor" está sempre vazia. Mesmo dentro da rotina, após a atribuição "value = this% fValue", o valor está vazio (len (value) é 0).
Parece que o compilador não pode detectar que o argumento é do tipo caractere (len = :), alocável e, portanto, não pode atribuir o valor a ele.
É claro que tenho algumas alternativas, mas a ideia de poder usar uma única montagem e sem argumentos opcionais para diferentes tipos de dados é muito boa.
Eu posso usar um tipo definido pelo usuário que eu criei para manipular seqüências de caracteres, por exemplo.
Mas gostaria de saber se esse é o comportamento padrão no Fortran 2008. E também, se existe uma maneira de fazer isso, usando esta rotina, com um único argumento fictício "class (*)", para converter tipos diferentes, incluindo o referido caráter alocável. Existe uma maneira de forçar a alocação dentro da rotina, por exemplo?
Eu aprecio seus comentários. Cheers, Eduardo