2013年7月3日水曜日

PIC C18 メモ(構造体に文字列)

------------------------------
構造体へ文字列を入れ込む
------------------------------
const rom struct { char aaa; rom char *rom str; }xxx;  //strは、ポインタ
const rom struct { char aaa; char ary[5]; }yyy;    //aryは、配列
  • 構造体を構成するときも、書き方は同じで、間に{ ; } が入るだけ
  • 配列とした場合、文字列なのかどうかは関係ない
  • この構造体を配列にしたい時、ary[5]のように文字数制限したくない場合が出てくる
    その為、*rom で文字列のポインタを置くと、文字列の長さを気にしなくてもよくなる(効率は落ちる)
------------------------------
宣言と同時に初期化
------------------------------
const rom struct{ char aaa; rom char *rom str; }xxx = { 0x3f, "namex", };
const rom struct{ char aaa; char ary[]; }yyy = { 0x3f, "namey", };
  • yyy の場合、ROM領域に、aaa のデータに続いて文字列が割り当てられている
  • xxx の場合は、aaa のデータの次は "namey" の文字列のポインタ(アドレス)が入っている
-----------------------------
構造体の配列
-----------------------------
typedef const rom struct { char aaa; rom char *rom str;}my_t;

my_t rrr = { 0x3f, "namer", };
my_t sss[ 2 ] = {{ 0x3f, "names",},{ 0x4f, "longnames",},};
  • 上で typedef で宣言した構造体を、下では配列として宣言し初期化
  • 文字列は別の場所に配置され、同じ文字列が見つかったら、ひとつにまとめてくれる
  • 文字列の長さは気にしなくていい

追試(宣言と同時に初期化)、次の記述でも同じ結果だった。

const rom struct{ char aaa; rom char *str; }xxx = { 0x3f, "namex", };
const rom struct{ char aaa; char rom *str; }yyy = { 0x3f, "namey", };


2010.02 - 2013.07.05