tsxbinのシンボル用のマクロを作成する際につまづいたり、わかりづらい所を思いつく範囲で紹介。まだ、ありそうだが思い出せないので、また、思い出したら追加するかも。
■ シンボルファイルを編集しているとtsxbinでシンボルが適用されない。
シンボルファイルを編集しながら、tsxbinで確認する際、シンボルファイルをエディタ開きっぱなしにしているとtsxbin上ではマクロが適用されない。エラーも出ないので、わかりづらい。どうせ読込みしかしないので適用されてもいいのではと思うが。。
■ ユーザ定義関数を使う場合
定義は一番最後に記述して、メイン処理の最後(関数定義の先頭直前)に必ず return; を書く。書かないと関数部分を実行してしまう。
■ ユーザ定義関数の引数の宣言
プロトタイプ宣言や関数の宣言で、void型は必ず明記する必要あり。
■ サイズ0の配列はファイル記述変数では無視される。
サイズ0でファイル記述変数に配列を割り当ててもエラーは出ない(単純に無視される)。
$char text[0];
■ 可変長のデータを持つ構造体をファイル記述変数で扱えない。
構造体っぽく表示させたい場合は、関数でそれっぽく読み込ませて、表示させるしかない。
void ReadStruct(void)
{
$char StructData.Type[4];
$int StructData.Length;
$int StructData.Header1;
$int StructData.header2;
int textlen = GetCurrentDword();
$int StructData.TextLength;
$char StructData.Text[textlen * 2];
}
■ Int64が使えない。
結構困るが、どうしようもないので、自分はtypedef.hにこんな感じで構造体を追加して使っている。$
struct int64 {
int L;
int H;
};
■ ファイル記述変数名にインデックス番号などを後から付与する。
ファイル記述変数の変数名は文字列を作成して実行時に割り当てられる。3行目のファイル記述変数の変数名がstring型の変数varnameになっているが、このような使い方をすると実際のシンボル表示では、var_name_sample_10と表示される。
int a = 10;
string varname = "var_name_sample_" + tostr(a);
$WORD length;
$char varname[length * 2];
■ 今から読み込む文字数を取得する。
文字数情報がデータに入っていないフォーマットでは、たいていNULLが区切りなので、FindByte()でNULLまでのバイト数を取得して文字数を算出する。
int len = FindByte(0);
$char str[len];
FindByte()では探すターゲットまでのデータ長を返すので、ターゲットとして指定したNULLを含める場合は+1する必要がある。
int len = FindByte(0);
$char str_with_null[len + 1];
■ ファイル終了位置の検出
GetFileSize()とGetCurrentOffset()を使う。
while(GetFileSize() > GetCurrentOffset()) {
....
}
■ 読み込んだ文字列でファイル判定や処理変更をするような場合
読み込んだ文字の比較を行うことができるFStrCmp()を使う。FStrCmp()では読込ポジションは変更されない。
if(0 == FStrCmp(0, 4, "FNFO"))
{
....
} else if(0 == FStrCmp(0, 4, "DLET"))
....
} else {
....
}
次は、upk用のシンボルファイルを紹介しようかと思う。