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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage