在Fortran中将可分配字符传递给具有无限多态伪参数的子例程
我正在尝试编写一个例程,它能够基于无限多态性将字符串转换为不同类型的数据类型。其思想是用户调用此例程,将变量传递到它希望存储数据的位置,并根据变量/参数类型定义转换的例程 以下是本例行程序的摘录:在Fortran中将可分配字符传递给具有无限多态伪参数的子例程,fortran,polymorphism,character,subroutine,fortran2003,Fortran,Polymorphism,Character,Subroutine,Fortran2003,我正在尝试编写一个例程,它能够基于无限多态性将字符串转换为不同类型的数据类型。其思想是用户调用此例程,将变量传递到它希望存储数据的位置,并根据变量/参数类型定义转换的例程 以下是本例行程序的摘录: subroutine GetAsScalar (this, value, status) !Arguments------------------------------------------------------------- class(TKeyword)
subroutine GetAsScalar (this, value, status)
!Arguments-------------------------------------------------------------
class(TKeyword) :: this
class(*) :: value
logical, optional :: status
!Local-----------------------------------------------------------------
integer :: stat
!----------------------------------------------------------------------
stat = 0
select type (value)
type is (REAL(real32)) !single precision
read (this%fValue, *, IOSTAT = stat) value
type is (REAL(real64)) !double precision
read (this%fValue, *, IOSTAT = stat) value
type is (LOGICAL)
read (this%fValue, *, IOSTAT = stat) value
type is (INTEGER(int32)) !integer
read (this%fValue, *, IOSTAT = stat) value
type is (INTEGER(int64)) !long integer
read (this%fValue, *, IOSTAT = stat) value
type is (CHARACTER(*))
value = this%fValue
class default
this%Message = "Invalid data type"
status = .false.
return
end select
if (present (status)) then
if (stat /= 0) then
status = .false.
else
status = .true.
endif
endif
end subroutine GetAsScalar
“此%f值”是一个“字符(len=:),可分配”字符串。
当我尝试使用此例程传递可分配字符串时,它会成功退出,不会引发错误/异常:
character(len=:), allocatable :: value
call keyword%GetAsScalar(value)
但是字符串“value”总是空的。
即使在例程内部,赋值“value=this%fValue”之后的值也是空的(len(value)为0)
编译器似乎无法检测到参数的类型为character(len=:),可分配,因此无法为其赋值
当然,我有一些选择,但是对于不同类型的数据,能够使用一个单独的rountine并且没有可选参数的想法真的很好
例如,我可以使用创建的用户定义类型来处理字符串
但我想知道这是否是Fortran 2008中的默认行为。
而且,如果有办法实现这一点,使用这个例程,使用一个“class(*)伪参数,转换不同的类型,包括引用的可分配字符。例如,有没有一种方法可以在例程内部强制分配
谢谢你的评论。
干杯
Eduardo在选择类型(或关联)构造中,关联名称从不具有可分配属性(16.5.1.6p2),无论选择是否具有该属性
在您的例子中,选择器也缺少该属性,值
伪参数未声明为可分配的。不允许将未分配的实际参数与非可选的不可分配的伪参数相关联。除此之外,不允许在选择类型或关联构造中使用未分配的选择器
您需要在调用之前将值
实际参数分配到某个长度,然后值
关联名称将在select类型构造中具有该固定长度。或者,将可分配字符变量包装为派生类型中的组件。在选择类型(或关联)构造中,关联名称从不具有可分配属性(16.5.1.6p2),无论选择是否具有该属性
在您的例子中,选择器也缺少该属性,值
伪参数未声明为可分配的。不允许将未分配的实际参数与非可选的不可分配的伪参数相关联。除此之外,不允许在选择类型或关联构造中使用未分配的选择器
您需要在调用之前将
值
实际参数分配到某个长度,然后值
关联名称将在select类型构造中具有该固定长度。或者,将可分配字符变量包装为派生类型中的组件。感谢您的解释,@IanH。我将添加使用我创建的派生类型(string)的可能性,但将保留使用string的可能性,在作为参数传递到例程之前,必须分配观察值。感谢您的解释,@IanH。我将添加使用我创建的派生类型(string)的可能性,但将保留使用string的可能性,在作为参数传递到例程之前必须分配观察值。