2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

TECS:変数のsize_is( )指定子

Last updated at Posted at 2019-11-25

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もどこかの領域を示すように初期化すれば参照渡し可能です

参考

TECSドキュメントーセルタイプ記述

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?