Создание гетерогенных массивов в Фортране
Я пытаюсь создать гетерогенные массивы, которые содержат переменные разных типов, например,[ 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