1

無制限のポリモーフィズムに基づいて、文字列をさまざまな種類のデータ型に変換できるルーチンを作成しようとしています。アイデアは、ユーザーがこのルーチンを呼び出し、データを格納する場所に変数を渡し、ルーチンが変数/引数の型に基づいて変換を定義することです。

このルーチンの抜粋は次のとおりです。

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

「this%fValue」は「character(len=:)、割り当て可能な」文字列です。割り当て可能な文字列を渡すこのルーチンを使用しようとすると、成功して終了し、エラー/例外は発生しません:

character(len=:), allocatable :: value
call keyword%GetAsScalar(value)

ただし、文字列「値」は常に空です。ルーチン内でも、"value = this%fValue" を割り当てた後、value は空 (len(value) は 0) です。

コンパイラは、引数が文字型 (len=:) であり、割り当て可能であることを検出できないため、値を割り当てることができないようです。

もちろん、いくつかの代替手段がありますが、単一のルーチンを使用でき、さまざまな種類のデータに対してオプションの引数を使用できないというアイデアは非常に優れています。

たとえば、文字列を処理するために作成したユーザー定義型を使用できます。

しかし、これが Fortran 2008 のデフォルトの動作であるかどうかを知りたいです。また、これを達成する方法があれば、このルーチンを単一の「class(*)」ダミー引数とともに使用して、割り当て可能な文字を参照しました。たとえば、ルーチン内で割り当てを強制する方法はありますか?

コメントをお待ちしております。乾杯、エドゥアルド

4

1 に答える 1

5

選択型 (または関連付け) の構成では、選択にその属性があるかどうかに関係なく、割り当て可能な属性 (16.5.1.6p2) が関連付け名に含まれることはありません。

あなたの場合、セレクターにもその属性valueがありません-仮引数は割り当て可能であると宣言されていません。割り当てられていない実引数をオプションではない割り当て不可能な仮引数に関連付けることは許可されていません。それを超えて、選択タイプまたは関連構造で未割り当てのセレクターを使用することは許可されていません。

value呼び出しの前に実際の引数をある程度の長さに割り当てる必要があります。valueアソシエート名は、選択型構造内でその固定長になります。または、割り当て可能な文字変数を構造型のコンポーネントとしてラップします。

于 2014-12-29T17:49:11.890 に答える