このブログを検索

2009年1月19日

仕事場でのRDPが革命過ぎて窓際一直線

最近家に帰るのが早くて20時には帰宅しています。
いや~、仕事が無いってのも疲れるなぁ。
今年度の前期が嘘のようですよ。

で、帰宅が早いのでネムぃに取り組む時間が増えました。
ちょっと贅沢にメモリを使いまくって快適にプログラミング、
のはずだったんだけど詰んだ。
もう精一杯詰んだ。

@文字列
ああ、わかってるさ。
Dの文字列が0終端じゃないってことくらい十二分に分かってるよ。
むしろ変に理解してたから駄目だった。

ネムぃの内外(D部分とWin32API部分)の橋渡しはTextって構造体が担当してるんだ。
省略して書くと

struct Text {
/// 実態。
wchar[] text;
}

こんな感じで内部に ptr ってメッソドがあるんだ。
こいつが駄目だった。


struct Text {
wchar[] text;

wchar* ptr() {
return (text ~ null).ptr;
}
}

text配列とnullを結合してたんだ。
コレで大丈夫だと思ってたんだ。
ここで0終端文字列を作ってると思ってたんでこいつをあっちゃこっちゃに使ってたんだ。
一通りの基盤部分が作り終わってメインウィンドウだけの結合をやってみる。
アイコンハンドル取ってくる関数でやたら落ちたりメニュー表示文字列がゴミつきだったりと散々なことに。
アイコンハンドル取得してるところは失敗したときに例外投げるようにしていてまだぜんぜんcatch書いてなかったので落ちても構わなかったんですが文字列にゴミが付くのはいただけない。
2-3時間ひたすら目で追ったりstd.stdio.writeしたり-covしたり。
でもね、writeで書き出される文字列はText構造体を表示させてたので当然引っかからない。
もう最後の望みを掛けてText構造体にメス入れ。
ゆっくり見直して text ~ null に違和感を。

あれ? この null ってホントに 0 なのか?
空配列っぽくね?


struct Text {
wchar[] text;

wchar* ptr() {
return (text ~ cast(wchar)0).ptr;
}
}

ああ、修正したら直ったさ。
アイコンハンドル取得するところもアイコンアドレスにゴミ混じってたから落ちてただけさ。

@GC
もはや何も語るまい。

0 件のコメント: