I'm looking for some general advice as to the best approach to creating a derived type that stores arbitrary data with arbitrary rank.
Say I have a derived type Result
with a data
component (amongst others):
type, public :: Result
private
class(*), allocatable :: data
...
end type
which is initialised by some procedure (called from an interface Result
):
function init(data) result(this)
type(Result) :: this
class(*), intent(in) :: data
allocate(this%data, source=data)
end function
This works fine for scalar data, but I'm unsure about how to go about setting it up for arbitrary-rank data. I know procedures can accept assumed-rank parameters, so data
in the init(data)
function could be data(..)
, but I'm not sure it's possible to specify the derived type property this%data
as being a assumed rank?
The other way I thought of doing it would be to store the arbitrary rank data as a scalar, if such a thing is possible in Fortran? This would be equivalent to using the serialize()
and unserialize()
functions in PHP. If anyone has any guidance on a similar approach, I'd be very grateful.
Ultimately I'd like to be able to do something like this:
type(Result) :: scalarResult
type(Result) :: 2DResult
scalarResult = Result(data=1.234)
2DResult = Result(data=[[1,2,3],[4,5,6]])
答案 0 :(得分:1)
不可能有假定的等级派生类型组件。您需要找到另一种解决方案,例如Vladimir建议的解决方案。另一种想法是存储数据的C_LOC和等级,调用构造适当C描述符的C例程,然后使用假定等级参数回调到Fortran例程。
请记住,你不能在Fortran中做出很多假设等级 - SELECT RANK在2015年之前不存在。