配列¶
PyFIE では PyFIE データ型に対して配列を作成することができます。 これを PyFIE 配列と呼ぶことにします。
PyFIE 配列は Python 組み込み型である "リスト" や "タプル" とは異なり、 複数個の(同じ型の)要素を格納する連続したメモリ領域をもった C 言語互換の配列となります。
PyFIE 配列は下記 PyFIE データ型に対して作成することができます。
PyFIE 算術型
PyFIE 構造体 及び PyFIE 共用体
VOID.PTR
型FHADLE
型
注釈
VOID.PTR
型以外のポインタ配列、
つまり "PyFIE 算術型、 構造体、 共用体等へのポインタ" に対する PyFIE 配列は作成することができません。
そのためこれらのポインタに対する配列が必要な場合は、
VOID.PTR
型に対する PyFIE 配列を使用することになります。
VOID.PTR
型に対する PyFIE 配列や、
ポインタと配列の関係については ポインタ の章で説明します。
PyFIE 配列の使用方法¶
PyFIE 配列の作成は、 要素となる PyFIE データ型(クラス)の属性 ARRAY
をコンストラクタとして使用します。
このとき配列の要素数はコンストラクタの引数で指定します。
- C 言語
INT a[3];
- Python
a = pyfie.INT.ARRAY(3)
作成直後の PyFIE 配列の各要素は 0 で初期化されています。 (PyFIE 配列の作成時に各要素の初期値を与えることはできません)
多次元の PyFIE 配列(つまり PyFIE 配列に対する PyFIE 配列)を作成する場合は引数を複数個指定します。 下記は 3 行 6 列の 2 次元 PyFIE 配列を作成する例です。
- C 言語
DOUBLE b[3][6];
- Python
a = pyfie.DOUBLE.ARRAY(3, 6)
尚、 PyFIE 配列インスタンスの要素数については Python 組み込みの len()
関数にて取得することができます。
- Python
a = pyfie.INT.ARRAY(3) num = len(a) # 配列 a の要素数 3 を得る.
配列要素へのアクセス¶
PyFIE 配列の各要素へのアクセスには Python のシーケンス型と同じように添字を使用します。
- C 言語
INT a[3]; INT b[2][5]; a[0] = -1; b[0][4] = -1;
- Python
a = pyfie.INT.ARRAY(3) b = pyfie.INT.ARRAY(2, 5) a[0] = -1 b[0][4] = -1
注釈
PyFIE 配列の各要素に対する値の設定では、 要素の PyFIE データ型へ変換可能なオブジェクトを使用することができます。
詳しくは各 PyFIE データ型に対する "オブジェクト変換" の説明を参照ください。
ここで注意すべき点は PyFIE 配列から取得した要素は 配列に格納されている要素の複製ではなく、 配列に格納されている要素そのもの (厳密にはデータ格納先を共有する PyFIE データ型のインスタンス)になるという点です。 この挙動は C 言語における挙動と異なりますので 下記サンプルコードは変数 i について異なる挙動を示していることに注意してください。
- C 言語
INT a[3] = {0}; INT i; i = a[0]; i = -1; // i の値が -1 になるだけであり a[0] の値は 0 のままである.
- Python
a = pyfie.INT.ARRAY(3) i = a[0] i.value = -1 # i は a[0] に格納されているインスタンスそのものなので a[0] の値は -1 となる.
注釈
この挙動は C 言語と Python の言語仕様の違いによるものです。 詳しくは PyFIE データ型を変数に代入する際の C 言語との挙動の違い を参照して下さい。
PyFIE 構造体や共用体に対する PyFIE 配列に関しても、 使用方法は同じです。 以下に PyFIE 構造体の使用例を示します。
- C 言語
PNT_T pnts[3] = {0}; pnts[0].x = 1; pnts[0].y = 2;
- Python
pnts = pyfie.PNT_T.ARRAY(3) pnts[0].x = 1 pnts[0].y = 2
PyFIE 配列の一括代入 (属性 value
)¶
PyFIE 配列はインスタンス属性 value
をもっています。
属性 value
には、
他の PyFIE 配列インスタンスや、 Python 組み込み型であるリスト型(list
)や
タプル型(tuple
)など任意のシーケンスを指定することができ、
配列の各要素に対する値の代入が行われます。
- C 言語
INT a1[5]; INT a2[2][3]; INT a3[5]; a1[0] = 1; a1[1] = 2; a1[2] = 3; a1[3] = 4; a1[4] = 5; a2[0][0] = 1; a2[0][1] = 2; a2[0][2] = 3; a2[1][0] = 4; a2[1][1] = 5; a2[1][2] = 6; a3[0] = a1[0]; a3[1] = a1[1]; a3[2] = a1[2]; a3[3] = a1[3]; a3[4] = a1[4];
- Python
a1 = pyfie.INT.ARRAY(5) a2 = pyfie.INT.ARRAY(2, 3) a3 = pyfie.INT.ARRAY(5) a1.value = (1, 2, 3, 4, 5) a2.value = ( (1, 2, 3), (4, 5, 6) ) a3.value = a1
また PyFIE 配列インスタンスの属性 value
を参照した場合、
複製された新たな PyFIE 配列インスタンスが得られます。
注釈
PyFIE 算術型、 PyFIE 構造体/共用体、 PyFIE ポインタ型 での "属性 value
への代入" は、
C 言語における "変数への代入" に相当しています。
これに対し C 言語における "配列型変数に対する代入" は仕様に存在しないため、
PyFIE 配列での属性 value
への代入は PyFIE 特有の仕様となります。
PyFIE 配列のポインタ¶
PyFIE 配列のポインタは ref
属性により取得できます。
- C 言語
INT a[3]; INT * p = a;
- Python
a = pyfie.INT.ARRAY(3) p = a.ref
この場合取得されるポインタは、 C 言語における配列のポインタの場合と同様に "配列の先頭要素である PyFIE データ型インスタンスへのポインタ" となります。
ポインタについての詳細は ポインタ の章を参照してください。
PyFIE 配列の演算¶
PyFIE 配列の内、一定の条件を満たすものは下記の演算子をサポートします。
二項演算子 |
|
単項演算子 |
|
代入演算子 |
|
これらの演算子は、要素となる PyFIE データ型が以下のいずれかである場合に使用できます。
PyFIE 算術型
PyFIE 構造体の演算 をサポートする PyFIE 構造体
各演算子は同じ型で同じ要素数の PyFIE 配列同士の演算、または Python 組み込みの数値型や PyFIE 算術型との演算に使用することができます。 演算結果は演算に使用した PyFIE 配列の型となります。
- Python
a = pyfie.INT.ARRAY(2) b = pyfie.INT.ARRAY(2) a.value = (1, 2) b.value = (3, 4) c = a + b # PyFIE 配列同士の演算. c は値 (4, 6) をもつ INT 型 PyFIE 配列となる. d = a + 1 # Python 組み込みの数値型との演算. d は値 (2, 3) をもつ INT 型 PyFIE 配列となる.
注釈
C 言語における "配列型変数に対する演算" はアドレスに対する演算となるため、 PyFIE 配列の演算は PyFIE 特有の仕様となります。