Передача размещаемого символа в подпрограмму с неограниченным полиморфным фиктивным аргументом в Фортране

Я пытаюсь написать подпрограмму, которая может преобразовывать строку в различные типы данных, основываясь на неограниченном полиморфизме. Идея состоит в том, чтобы пользователь вызывал эту подпрограмму, передавая переменную, в которой он хочет хранить данные, и подпрограмму для определения преобразования на основе типа переменной / аргумента.

Выдержка из этой процедуры здесь:

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 (*)", для преобразования различных типов, включая именуемый выделяемый символ. Например, есть способ форсировать распределение внутри подпрограммы?

Я буду благодарен за ваши комментарии. Ура, Эдуардо

Ответы на вопрос(1)

Ваш ответ на вопрос