4

テーブルとこのテーブルの長さを含む派生データ型を作成したいと思います。理想的には、次のように宣言したいと思います

type mydata
    integer                :: ndata
    real, dimension(ndata) :: x
end type mydata

しかし、最初は ndata がわからないため、x は動的テーブルです。

allocatablendata がわかっている場合、for xを使用して割り当てる必要がありますか?

type mydata
    integer                         :: ndata
    real, dimension(:), allocatable :: x
end type mydata

....

type(mydata) :: var
var % ndata = 10
allocate(var % x(10))

このようなケースを管理する最善の方法は何ですか?

4

1 に答える 1

6

問題を解決する最善の方法は、最新の Fortran 2003 準拠のコンパイラを使用し、パラメータ化された派生型を使用することです。メモリがうまく機能する場合、現在この機能をサポートしているのは Cray と IBM のコンパイラだけです。このようなタイプを定義できるようになります

type mydata(sz)
    integer, len :: sz
    real, dimension(sz) :: x
end type mydata

これはまさにあなたが望むもののようです。これらのコンパイラのいずれも持っていない場合は、提案したような回避策で当分の間満足する必要があります。もちろん、好みの回避策をデフォルト以外の型コンストラクターにバンドルすることもできます。

パラメータ化された派生型がなくて行き詰まっている場合は、次のような型定義から始めます。

type mydata
    real, dimension(:), allocatable :: x
  contains
    procedure :: setSize
    procedure :: getSize
end type mydata

これらのタイプ バインド プロシージャを明白な (?) 方法で定義します。ndataこれにより、サイズがx異なってしまうのを防ぐことができます。

于 2013-11-06T11:16:27.223 に答える