5: 2004-01-21 (水) 01:49:21 [6] | 6: 2004-01-21 (水) 15:32:42 [7] | ||
---|---|---|---|
Line 57: | Line 57: | ||
-lib_flushgraphbox(0x8001, window, x, y, w, h, 200 - w, (char *) gbox + 64 + x + y * g_mainWinWidth); で w = 0; のとき、CS:EIP=0020:009A3 が発生。 -- [[ベイサイド]] SIZE(10){2004-01-21 (水) 01:36:34} | -lib_flushgraphbox(0x8001, window, x, y, w, h, 200 - w, (char *) gbox + 64 + x + y * g_mainWinWidth); で w = 0; のとき、CS:EIP=0020:009A3 が発生。 -- [[ベイサイド]] SIZE(10){2004-01-21 (水) 01:36:34} | ||
-w=0っていうのはつまり0ドットなので、そんな指定をするのはおかしいんじゃないかなあ。たぶん0を指定すると42億を指定したとみなされて、そうなるとメモリの果てまでアクセスすることになり、その中には当然16以上の数値が入っているところがあるのでは? -- ''K'' SIZE(10){2004-01-21 (水) 01:48:35} | -w=0っていうのはつまり0ドットなので、そんな指定をするのはおかしいんじゃないかなあ。たぶん0を指定すると42億を指定したとみなされて、そうなるとメモリの果てまでアクセスすることになり、その中には当然16以上の数値が入っているところがあるのでは? -- ''K'' SIZE(10){2004-01-21 (水) 01:48:35} | ||
+ | -0文字描画のときもそうでしたが、関数の引数は可変なので0になることもあります。どの関数のどの引数が0を許してないのかわからないと今回みたいに泥沼になってしまいます。結局気づくのに半日かかりました。ちなみに(x0,y0)-(x1,y1)でx0=x1のときw=0(縦線)になります。 -- [[ベイサイド]] SIZE(10){2004-01-21 (水) 10:06:06} | ||
+ | -ああ、x1やy1をそういう風に捉えているのなら、wやhの計算方法を見直す必要があります。wやhはx1-x0などという意味ではなく、描画サイズであることに注意してください。 -- [[K]] SIZE(10){2004-01-21 (水) 10:45:05} | ||
+ | --w = x1 - x0 + 1; | ||
+ | --h = y1 - y0 + 1; | ||
+ | -OSASKのAPIでは、サイズを示すすべてのパラメータで、0を指定するのを禁じています。そのような呼び出しに意味がないからです(ファイルサイズ変更などでは意味があるので例外的に0でもよい)。0になるかもしれない場合はサイズが0以外のときだけにAPIを呼ぶようにしてください。これは将来OSASKが安全モードAPIを持つようになっても変わりません。安全モードでサイズ0を指定するとエラーメッセージが出てどれが原因かを教えてくれますが、アプリが強制停止させられることにかわりはありません。 -- ''K'' SIZE(10){2004-01-21 (水) 10:51:03} | ||
+ | --(例) if (w > 0 && h > 0) lib_flushgraphbox(...); | ||
+ | -大変参考になりました。0を禁止しているのは仕様だったんですね(笑) -- ''ベイサイド'' SIZE(10){2004-01-21 (水) 15:32:42} | ||
#comment | #comment |
(This host) = http://osask.net