長かった。
デバッグ一発目である程度の精度を持たせておかないとバグも拾えないし、
そのためのコード追いのみでの人力デバッグに時間がかかった。
今日の詰まりポイント。
_tcscpy_s(Buffer, BufSize, Text);
このバッファサイズというのが曲者で。
最初、宣言時に要素数に指定した定数をそのまま入れてたんですよ。
その後、あれ、これって要素数を入れるんだっけ、サイズ*要素数を入れるんだっけというのがわからなくなって
とりあえずsizeof(Buffer) / sizeof(Buffer[0])と書き換えたんですね。
この書き方がもっとも正しいと思っていたし、こう書いてみてやっぱり定数のままでよかったのかーなんて思ったりもしました。
するとバグ。メモリ関係がわけわからんくなってる。
どこでオーバーランしたのか文字列処理を一つずつ追ってぐぐって要因になりそうな部分を捜索。
ようやく見つけたのがこれ。ttp://ch.cri-mw.co.jp/hirase/55242.html
sizeofというのは便利なもので、確保してある要素数を返すのではなく、実際に使っている要素数を返すんですよ。
それでいいじゃんと思うことなかれ。
文字列を代入してある場合、sizeofで帰って来るのは\0までの数なんですわ。
つまりですね。
TCHAR buf[8] = {_T("hoge")}; int szBuf = 0; szBuf = sizeof(buf); // szBuf == 4 // _tcscpy_s(buf, szBuf, _T("pugya-")); // warning! szBuf = _countof(buf); // szBuf == 8 _tcscpy_s(buf, szBuf, _T("pugya-")); // safety
これにはまってまして。
しかも、皮肉なことに領域確保自体は出来ていてオーバーランしないような構成にもなっているだけに警告を無視しても動く。
何故警告が出ているのかが本当に理解できずにかなり悩みました。
さて、そんなこともあったりしたけど、とりあえず振り仮名は振れるようになりました。
とりあえずというのは本当にとりあえずだからですね。
やっぱり"n"の表記がブレブレなので"幻影"とかが"げねい"になったりして超ださい。
かといってそっちにあわせると、n行が全部ん+あ行になっちゃうのでどうにもこうにも。
あと、振り仮名検索できるように長音はそのままにしたんだけど、
そうすると_tcscmpで並べると下に行っちゃうんですよね。
アースクエイクが一番上にこないとやっぱおかしいもんなぁ。
となると振り仮名は"ああすくえいく"になるんだけど、そうなると振り仮名検索に使う作戦は破綻ですよね。
あ、検索ボックスに入れられたら"あーすくえいく""ああすくえいく"の両方で検索すればいいのか。
じゃあとりあえず"ああす"になるように改造しておくか。