Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Fortran中将可分配字符传递给具有无限多态伪参数的子例程_Fortran_Polymorphism_Character_Subroutine_Fortran2003 - Fatal编程技术网

在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的可能性,在作为参数传递到例程之前必须分配观察值。