2006-07-25-01-ひさびさに Fatal Error
>> Site top >> weblog >> 月別アーカイブ >> 2006年07月のlog >> 2006-07-25-01-ひさびさに Fatal Error
最終更新日付:2006/07/25 01:00:00
ひさびさに Fatal Error
2006 年 07 月 25 日
...正体不明の Fatal Error が ListMakeDA で頻発。それを退治しに長い旅路へ。さっき帰ってきた。
かいつまんで言うと、DA でコールバック関数を伴う API 呼び出しを行うのは不自由すぎるということだな。そもそも static な変数も置けないし、大域も使えない。それでコールバックを利用しても、パラメータ以外のものを手に入れる方法がない。陰郎の場合はクラス中心で実装するけれども、コールバック関数はクラススコープのメンバとして定義するから this ポインタが使えない。
そんな状況を回避するためにやらかした陰郎の荒ワザ(というか横着)が諸悪の根源だったのだ。API に文字列リストを渡すべきところを、タイプシステムを出し抜いて this ポインタを忍び込ませてコールバックに渡そうとしたのだが、どうやらそこを OS 内部で見ていたらしい(コールバックする場合は見る必要が無いはずなのにだ!)。それでクラッシュしていたのだ。コレに気付くのに結構な時間がかかった...というのも、クラッシュするタイミングが全然別だったので。
そもそも、コールバック関数のシグネチャに十分なパラメータ(最低限でも1つのユーザー定義ポインタ)が用意されていないのであれば、そのコールバックは大域への依存を免れない。陰郎はそれが嫌だったから敢えてタイプシステムを出し抜こうとした(まぁその考えが横着すぎたのだが)。残念ながら伝統的なCプログラミングの世界では、皆が口を揃えて言うほどには大域を禁忌としていない。そのような(残念ながら)詰めの甘いインタフェイスに直面すると、自分のデザイン水準(と少なくとも考えているもの)に忠実になろうとしてハッキングに近い領域に片足を突っ込むことになる。結果は最初に書いたとおりだ...といっても一方的に Palm OS API を悪く言うつもりもないのだけどね。郷に入らば郷に従えとも言いますから。
うん、今日も勉強になった。続きは明日...かな。
コメント
このページのタグ
Page tag : Palm
Copyright(C) 2005-2021 project-enigma.
Generated by CL-PREFAB.