rstellen heterogener Arrays in Fortr
Ich versuche, heterogene Arrays zu erstellen, die Variablen unterschiedlichen Typs enthalten, z. B.[ 1.0, 7, "hi" ]
. Ich habe versucht, @ einzubeziehclass(*)
odertype(*)
im Array-Konstruktor (siehe das Ende des folgenden Codes), aber gfortran5.2 betrachtet es einfach als Syntaxfehler. Gibt es eine Möglichkeit, ein solches Array mit einem Array-Konstruktor zu erstellen, oder ist es erforderlich, einen anderen Ansatz zu verwenden (z. B. einen Typ zu definieren, der jedes Element separat enthält)?
Mehr Details
Der folgende Code ist ein Beispiel, warum ich ein solches Array erstellen möchte. Daschecktype_multi
Routine erhält mehrere Argumente mit demoptional
Schlüsselwort, aber dieser Ansatz ist aufgrund der festen Anzahl von Argumenten eindeutig begrenzt. Um eine beliebige Anzahl von Argumenten zuzulassen, habe ich versucht, daschecktype_array
Routine, aber es scheint nicht möglich zu sein, ein Array mit verschiedenen Typen zu übergeben ... Ein praktischeresFal kann eine Unterroutine zum Drucken einer variablen Anzahl von Argumenten mit verschiedenen Typen sein.
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