Создание гетерогенных массивов в Фортране

Я пытаюсь создать гетерогенные массивы, которые содержат переменные разных типов, например,[ 1.0, 7, "hi" ], Я пытался включитьclass(*) или жеtype(*) в конструкторе массива (см. конец следующего кода), но gfortran5.2 просто считает это синтаксической ошибкой. Есть ли способ создать такой массив с помощью конструктора массива или необходимо использовать другой подход (например, определить тип, который содержит каждый элемент отдельно)?

Больше деталей:

Следующий код является примером того, почему я хочу создать такой массив.checktype_multi процедура получает несколько аргументов сoptional ключевое слово, но этот подход явно ограничен из-за фиксированного количества аргументов. Чтобы разрешить произвольное количество аргументов, я попробовалchecktype_array рутина, но кажется невозможным передать массив с разными типами ... Более практичнымдело может быть сделать подпрограмму для печати переменного количества аргументов различных типов.

module mymod
    implicit none
contains

    subroutine checktype ( x )
        class(*) :: x

        select type ( x )
            type is ( integer )      ; print *, "int    : ", x
            type is ( real )         ; print *, "real   : ", x
            type is ( character(*) ) ; print *, "string : ", x
        endselect
    end subroutine

    subroutine checktype_multi ( x1, x2, x3 )
        class(*), optional :: x1, x2, x3

        print *
        if ( present( x1 ) ) call checktype ( x1 )
        if ( present( x2 ) ) call checktype ( x2 )
        if ( present( x3 ) ) call checktype ( x3 )
    end subroutine

    subroutine checktype_array ( a )
        class(*) :: a(:)
        integer :: k

        print *
        do k = 1, size( a )
            call checktype ( a( k ) )
        enddo
    end subroutine

end module

program main
    use mymod

    call checktype_multi ( 1.0 )
    call checktype_multi ( 1.0, 7 )
    call checktype_multi ( 1.0, 7, "hi" )

    ! call checktype_array ( [ 1.0, 7, "hi" ] )  !! error (this is to be expected)

    !>>> Here is the problem.
    ! call checktype_array ( [ type(*)  :: 1.0, 7, "hi" ] )  !! this is also an error
    ! call checktype_array ( [ class(*) :: 1.0, 7, "hi" ] )  !! this too
end program

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

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