gpt4 book ai didi

arrays - 在 Fortran 中创建异构数组

转载 作者:行者123 更新时间:2023-12-04 14:57:07 26 4
gpt4 key购买 nike

我正在尝试创建包含不同类型变量的异构数组,例如,[ 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

最佳答案

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

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

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

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

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

关于arrays - 在 Fortran 中创建异构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33621185/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com