在Fortran中创建异构数组

时间:2015-11-10 01:07:21

标签: arrays fortran heterogeneous

我正在尝试创建包含不同类型变量的异构数组,例如[ 1.0, 7, "hi" ]。我尝试在数组构造函数中包含class(*)type(*)(请参阅下面代码的结尾),但gfortran5.2只是将其视为语法错误。有没有办法用数组构造函数创建这样的数组,或者是否有必要使用不同的方法(例如,定义一个单独包含每个元素的类型)?

更多详情:

以下代码是我想创建这样一个数组的一个例子。 checktype_multi例程使用optional关键字接收多个参数,但由于参数数量固定,这种方法明显受限。为了允许任意数量的参数,我尝试了checktype_array例程,但似乎无法传递具有不同类型的数组...更实际的case可能是为打印变量创建子例程各种类型的参数数量。

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 个答案:

答案 0 :(得分:5)

数组的元素在值上可能只有不同。它们的类型或任何其他属性不同。

相反,在无限多态可分配组件周围使用派生类型包装器。然后,组件的动态类型被视为包装器类型的对象值的一部分。

TYPE :: wrapper
  CLASS(*), ALLOCATABLE :: item
END TYPE wrapper

CALL sub([wrapper(1), wrapper(2.0), wrapper('3')])

(数组构造函数(或结构构造函数)指定一个值。值本身不能是多态的,值的类型总是只是值的类型。可选的前导类型规范的语法在数组构造函数中反映了这一点,因为它只是 type-spec ,而不是声明类型规范。)