2017-06-15 4 views
1

私は、任意のランクの任意のデータを格納する派生型を作成するための最良のアプローチについていくつかの一般的なアドバイスを探しています。いくつかの手順で初期化される派生型のコンポーネントとして仮定ランクのFortran配列を使用

type, public :: Result 
    private 
    class(*), allocatable :: data 
    ... 
end type 

を(インターフェースResultから呼び出さ):

function init(data) result(this) 
    type(Result) :: this 
    class(*), intent(in) :: data 

    allocate(this%data, source=data) 
end function 

この作品

私は(とりわけ) data成分と構造型 Resultがあるとスカラーデータの場合は問題ありませんが、任意ランクのデータを設定する方法についてはわかりません。私はプロシージャが想定ランクのパラメータを受け入れることができるので、 init(data)関数の datadata(..)になる可能性がありますが、導出型プロパティ this%dataを想定ランクとして指定することは可能ですか?

他の方法では、Fortranでこのようなことが可能な場合は、任意のランクのデータをスカラーとして保存することになりますか?これは、PHPでserialize()unserialize()関数を使用するのと同じです。誰かが同様のアプローチに関するガイダンスを持っているなら、私はとても感謝しています。

最終的に私はこのような何かをできるようにしたいと思います:

type(Result) :: scalarResult 
type(Result) :: 2DResult 

scalarResult = Result(data=1.234) 
2DResult = Result(data=[[1,2,3],[4,5,6]]) 
+0

ランクごとに別々のタイプを持ち、それぞれのタイプに固有の汎用関数を持つことをお勧めします。コンパイラがサポートしている場合は、ランクタイプのパラメータで型をパラメータ化してください。 –

+0

変数を作成した後、変数を使って何をするつもりですか? – IanH

+0

私はそれらを関数からエラーメッセージとともに返すために使用しています: 'type(Result)'にはここには示されていない 'error'コンポーネントもあります。これは別の派生型' type(ErrorInstance) 'です。関数はデータとおそらくエラーを返します。データ自体の最終用途は、例えば、他の関数に渡されたり、どこかに印刷されたりするかもしれません。私は、Vladimirが別々の型を持つことを提案しましたが、これは有限次元にしか対応できないという明らかな制限があります。 –

答えて

1

仮定ランク派生型コンポーネントを持ってすることはできません。あなたは、Vladimirが示唆しているような別の解決策を見つける必要があります。 klugeのようなもう一つのアイデアは、データとランクのC_LOCを保存し、適切なC記述子を構築して、引き継いだ引数を持つFortranルーチンにコールバックするCルーチンを呼び出すことです。

Fortranで想定されるランクでは大したことができないことに注意してください。SELECT RANKはF2015まで存在しません。

関連する問題