私は、任意のランクの任意のデータを格納する派生型を作成するための最良のアプローチについていくつかの一般的なアドバイスを探しています。いくつかの手順で初期化される派生型のコンポーネントとして仮定ランクの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)
関数の
data
は
data(..)
になる可能性がありますが、導出型プロパティ
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]])
ランクごとに別々のタイプを持ち、それぞれのタイプに固有の汎用関数を持つことをお勧めします。コンパイラがサポートしている場合は、ランクタイプのパラメータで型をパラメータ化してください。 –
変数を作成した後、変数を使って何をするつもりですか? – IanH
私はそれらを関数からエラーメッセージとともに返すために使用しています: 'type(Result)'にはここには示されていない 'error'コンポーネントもあります。これは別の派生型' type(ErrorInstance) 'です。関数はデータとおそらくエラーを返します。データ自体の最終用途は、例えば、他の関数に渡されたり、どこかに印刷されたりするかもしれません。私は、Vladimirが別々の型を持つことを提案しましたが、これは有限次元にしか対応できないという明らかな制限があります。 –