TECS:「変数の**size_is( )**指定子」でつまずいたので、同じ悩みが生じた方のため書き留めておきます.
そもそも変数のsize_is( )指定子とは
変数がポインタ型の時に指定できます.そのポインタは引数で示される大きさの配列を指します.
ここで重要となるのは
- size_is( )指定されたポインタ型の変数は、配列を指す定数として扱われ、書換えることはできない
- ポインタの指す先の配列の要素は書き換えることができる
- 初期値の有無に関係なく指定された大きさの領域が確保される
この3点を押さえましょう.
実装例
大きさ32の文字列strを実装する場合、以下のようになります.
celltype tCelltype {
attr {
int name_len;
};
var {
[size_is(len)]
char *str;
};
};
cell tCelltype Cell {
name_len = 32;
};
このように属性を利用して、セルごとに大きさを指定できるようにするのが良いと思います.
以下も同じ振る舞いをします.
celltype tCelltype {
var {
char str[32]
};
};
注意点
size_is( )指定子は**「初期値の有無に関係なく指定された大きさの領域が確保される」**ということを思い出し、以下のことに注意しましょう.
celltype tCelltype {
attr {
int len;
};
var {
int *num;
[size_is(len)]
int *array;
};
};
cell tCelltype Cell {
len = 32;
};
上の例において、ポインタを初期化することなく
- numは参照渡しすることはできない
- arrayは参照渡しすることができる
両方できないと勘違いしていましたが、arrayはsize_is( )指定している時点で領域が確保されているので可能です.
※ もちろんnumもどこかの領域を示すように初期化すれば参照渡し可能です