構造体
- 構造体を定義:
a = CREATE_STRUCT(NAME='構造体名','タグ名1',値1,'タグ名2',値2, ...)
- 別の定義の方法1:
a = CREATE_STRUCT(NAME='構造体名',['タグ名1', 'タグ名2', ...],値1, 値2, ...)
。タグ名を文字列の配列で与えることもできる。
- 別の定義の方法2:
a = {構造体名,タグ名1:値1,タグ名2:値2, ...}
- 例:
a = {star, name:'', ra:0.0d, dec:0.0d, inten:FLTARR(12)}
- CREATE_STRUCT関数と{ }で作る方法の比較: 前者は構造体名やタグ名を文字列で与えられるためプログラム中で動的に構造体を構築できる。
- 一度定義された構造体は次からは構造体名だけで作成できる:
b = {構造体名}
- 構造体の継承1 (構造体名を使う):
b = {新しい構造体名, タグ名1:値1, ... , inherits 継承元の構造体名, タグ名2:値2, ...}
- 構造体の継承2 (構造体変数を使う):
b = CREATE_STRUCT(タグ名1:値1, ... , 継承元の構造体変数, タグ名2:値2, ...}
- 構造体の作成時に構造体名を省略すると無名構造体となる。
- 構造体のフィールドを動的に追加していく場合は無名構造体のほうが便利。
- 構造体であるかどうかを判定する:
SIZE(Structure,/TNAME) eq 'STRUCT'
- 構造体のフィールドを参照:
Structure.Tag
- 構造体のi番目のフィールドを参照:
Structure.(i)
- タグ名を文字列で指定して構造体のフィールドを参照:
Structure.(WHERE(TAG_NAMES(Structure) eq 'NAME')
(タグ名は大文字で指定する)
- 構造体のメンバの合計サイズ(バイト):
N_TAGS(Structure,/DATA_LENGTH)
- 構造体が実際にメモリー上で占めるサイズ(パディングを含む・結果は環境依存):
N_TAGS(Structure,/LENGTH)
- 構造体のフィールド数:
N_TAGS(Structure)
- 構造体に含まれる全てのタグ名:
TAG_NAMES(Structure)
- 構造体が特定のタグ名を持つか判定:
(WHERE(TAG_NAMES(Structure) eq 'NAME'))[0] ne -1
(タグ名は大文字で指定する)
- 構造体名:
TAG_NAMES(Structure,/STRUCTURE_NAME)
。無名構造体の時は長さ0の文字列を返す。
- 構造体のフィールド一覧を表示(IDL8以降では配列でない場合の/STRUCTUREは不要):
help,Structure,/STRUCTURE
- 構造体へのポインタを扱うときには演算子の優先順位に注意が必要。ポインタのでリファレンス演算子(*)の優先順位は、構造体のフィールド参照演算子(.)よりも低い。pStructure が構造体へのポインタの配列とするとき、
(*pStructure).Tag
等とする必要がある。
- 構造体の配列を作成するにはREPLICATE関数を使う。
Structure_Array = REPLICATE(Structure, 100)
とすると要素数100の構造体の配列ができる。
- 構造体の配列からあるフィールドをまとめて取り出すことができる。取り出した結果は配列になる。
Structure_Array.Tags
- 構造体Aを構造体Bにコピーする:
B = A
(構造体Bがもともと持っていた情報は失われる)
- 構造体Bの構造を保持したまま、構造体Aから構造体Bにフィールドごとに値をコピーする:
STRUCT_ASSIGN, A, B
(Aに存在しないフィールドは0(またはそれに相当する値)がセットされる。Bに存在しないフィールドは無視される。型の異なるフィールドは必要に応じて型変換が行われる。Aに存在しないフィールドを無視するには NOZERO
キーワードをセットする。)
- 2つの構造体を比較するには、ASTROLIBのCOMPARE_STRUCT()を用いると便利。
西田圭佑 (NISHIDA Keisuke)
nishida at kwasan.kyoto-u.ac.jp
$Id: structure.html,v 1.7 2022/05/19 16:24:54 nishida Exp nishida $