しらたまのコミッタ日記

2007-11-18

[][][][]いろいろ更新 22:34

ここ最近、ちょっとサボっていた分、いろいろコミットしました。

……相変わらずバグトラの件数は減ってませんが。

  • 文字列のまま送信する「キー文字送信」「窓ハンドルキー文字送信」命令を追加。(r187)
  • 区切り文字がない場合動作を行わない「範囲内切り取る」「範囲内置換」命令を追加。(r189)
  • 指定した文字列を繰り返した文字列を作る「リフレイン」命令を追加。(r190)
  • gnakoで「クライアントW」が使えない不具合を修正。(r191)
  • gnakoの「フォーム」部品に「クライアント幅」「クライアント高さ」を追加。(r191)
  • グループのメンバ関数/イベントを実行したときにメモリリークする不具合を修正。(r192)
  • vnakoで「ステータスバー」を作成したときに基本Yを変更しないようにした。(r193)
  • 画像ビット数変更」の説明にミスタイプがあったのを修正。(r194)
  • NTP時刻同期」命令を追加。(r194)
  • 計算命令として「乗」「剰余」「TAN」「ARCSIN」「ARCCOS」「CSC」「SEC」「COT」「正弦」「余弦」「正接」「逆正弦」「逆余弦」「逆正接」「余割」「正割」「余接」「SIGN」「符号」「HYPOT」「斜辺」「平方根」「WRGB2RGB」「RGB2WRGB」「自然対数」「常用対数」「対数」「度変換」「ラジアン変換」を追加。(r195)

うーん、並べてみましたが、あんまり込み入った作業はしていませんねぇ。

sqlite3対応とか、画像処理関連、ブラウザを筆頭とした各種GUI部品の調整もやりたいんですが、作業量が……

mr-80bmr-80b2007/11/18 22:55おおーお疲れ様です!

kujirahandkujirahand2007/11/19 14:40お疲れ様です!!

2007-10-14

[][][]DLLポインタ22:21

ポインタDLL関数に渡すとき、文字列実数ならば、参照渡しを付けておけば、のまま渡してもきちんと指定した変数へのポインタを渡すなりなんなりしますが、整数の場合はPOINTERアドレスを渡さなければなりません。(先ほどまでそれすらうまく動いていなかったので修正しました)

これは、なでしこポインタ型が使われていないため、POINTERの返り値と整数の値とが区別できないためです。*1

「使われていない」と書きましたが、じつは内部的にはポインタ型があります

しかし、全く使われていません。

これを使うようにすれば、ポインタ整数データ的に区別が可能になるので、この問題は解決するでしょう。

ただ、問題がありますポインタ型は演算できないのです。

例えば、POINTER命令がポインタ型を返すようにすると、「POINTER(A)+1」はPOINTER(A)の値にかかわらず1になります。

まあ、ちゃんと演算できるように修正すればいい話なんですが、修正が随所にありそうで修正漏れが起こりそうな気配が……

型変換(TOINT)が必要いうことにすれば修正は数カ所ですみますが、度は互換性の問題が出るんですよね……

*1POINTERの返り値と整数変数とだけなら区別可能です。

2007-08-04

[][]正規表現マッチの不具合 12:47

対策しました。

修正でなく対策です。

どうせゴミが1つつくなら、パターンに「.」を追加してしまおうという消極的な策。

もうちょっとどうにかなりませんかねぇ。

MillaMilla2012/06/28 10:41That's a smart answer to a tricky qutieson

qpdffivaqpdffiva2012/06/29 04:448llkQT <a href="http://sglvbogatjqs.com/">sglvbogatjqs</a>

okzwclokzwcl2012/06/29 15:48j4aujA , [url=http://gwgssdecbbcr.com/]gwgssdecbbcr[/url], [link=http://zraedjvwsatn.com/]zraedjvwsatn[/link], http://qqlydfxnienr.com/

iwxubrviiwxubrvi2012/07/01 01:31VxCFOh <a href="http://sdaunhsewvkp.com/">sdaunhsewvkp</a>

coutmlgycoutmlgy2012/07/01 06:249hi7ID , [url=http://mqlrmfhxvokx.com/]mqlrmfhxvokx[/url], [link=http://tnhfbqkmnnft.com/]tnhfbqkmnnft[/link], http://znxezapauiaz.com/

2007-04-12

[]「変数エイリアス作成」で不正なポインタ処理 21:37

Ver.1.4015aの頃から発生していたバグの模様。

の頃のソースの差分とかを見てもよくわからなかったので、デバッガでちまちま追いかけてみました。

すると、どうもスタックに積んだ参照渡しした引数を消すときに、消しすぎている気配が濃厚です。

例えば以下のコード

Aとは整数

Bとは整数

AをBに変数エイリアス作成

スタックに積まれた状態だと、Stack[0]->AとStack[1]->B*1となるのですが、命令実行後、つまりスタックを消す直前にはB->Aとなっているので、Stack[0]->AとStack[1]->B->Aとなるわけです。

して解放処理、hi_var_free関数変数解放するのですが、この中でリンク型はhi_getLink関数でもって参照先を確認し、参照カウントを減らします。ここで参照カウンタが負数になれば参照先を解放します。

で、hi_getLink関数なんですが、この関数リンク型が指す変数リンクだった場合は、リンクに対してhi_getLink関数を実行します。

つまりhi_getLink関数再帰的に呼び出されます。

これにより、hi_getLink関数一回の呼び出しで確実に値を取得できるのですが、単純にひとつ先だけ取得したいだけの時は困ります。

回のケースが困るときです。

Stack[1]->B->Aにおいて、Stack[1]を解放しようとすると、hi_getLink関数に従ってAが取得され、参照カウンタが減らされます。

この結果、B->Aと参照があるにもかかわらず、Aは参照カウンタが実際の参照の数を下回ってしまいます。

このため、終了時に変数解放するとき、Aを解放しようとすると、本来は参照カウンタが1以上で、参照カウンタが減らされるだけのはずなのに、Aが解放されてしまうため、Bを解放しようとするときに、の(すでに解放されている)参照先も解放しようとしてエラーが出ます。

たまにエラーが出ないときがあるのは、解放された領域が不定なためです。

 

で、解決案なのですが、これがいい方法を思いつけません。

スタック変数を消すときだけ、hi_getLink関数を使わないようにすればいいのでしょうが、スタックは汎用のTHiArrayクラスで処理しているので、解放処理をいじるとこれを使っている処理全部に影響が出てしまいます。

プロパティにforStackとか増やせばいいのかもしれませんが、なんか不格好なような気も……

まあ他に方法が思いつかなければ、これで行かなければしょうがないんですが。

*1:->はリンク(エイリアス)を表します

FrankieFrankie2012/06/28 02:00More posts of this quaitly. Not the usual c***, please

rtpessgetrtpessget2012/06/28 13:40WZNNO9 <a href="http://tqbiobbimnpy.com/">tqbiobbimnpy</a>

larxcdqjpaelarxcdqjpae2012/06/29 14:53d72C9p , [url=http://ymcluirlkumx.com/]ymcluirlkumx[/url], [link=http://xniccmqghycj.com/]xniccmqghycj[/link], http://dmitljqlhnvi.com/

xwdriczkxwdriczk2012/07/01 00:33rrXxdX <a href="http://rlhstuzhogsx.com/">rlhstuzhogsx</a>

awezgwawezgw2012/07/01 05:29CtrnXh , [url=http://hapgyydkbbgv.com/]hapgyydkbbgv[/url], [link=http://oqgssvftuusp.com/]oqgssvftuusp[/link], http://owpqqjissnxd.com/

2007-03-29

[][]DLLなどの型について 17:56

いろいろコミットしました。

の中に、コミットメッセージだけでは理解しづらいものがあるのでここで解説。

DLL関数などの型の内部置換方法を変更。

回のコミットDLLの型の置換を、完全一致固定から部分一致の繰り返しに変更しました。

これによりポインタが扱いやすくなりました。

例えば「int *a」などは「PLONG a」などに置き換えられて、引数を参照渡しにしておけば、ちゃんと引数を書き換えて返してくれます。

しかし、これには副作用あります

置き換えた型を見てもらえばわかるように、先頭の「P」はポインタであることを示し、それをのぞいた文字列で型を表します。

の型の判断は「P」がつかないときと同じ判断方法で行います。

つまり、「PH*」などという型は「PDWORD」に置き換えられます。

これによって、例えばなでしこ変数型である「PHiValue」などは「PDWORD」に置き換えられてしまい、のまま書いただけでは誤作動を起こしてしまいます。

回避策としては「P」の後ろに「_」とか適当な文字を挟んでおけばよいです。

 

私はこの副作用を含めても、この変更を適用した方が便利だと思ったんですがどうなんでしょうねぇ。

 

もしここ見ておられる方で、この機能が適用されたdnakoを使ってみたいと思われる方は、dnako.dllを置いておきますのでテストをしてみて下さい。

して、もし不都合がありましたらご報告下さい。リポジトリロールバックなど何らかの対策をとります。

※元のdnako.dllリネームするなどして、決して上書きしないようご注意下さい。

http://white-ball.hp.infoseek.co.jp/dnako_debug.zip

200612
200701020304050708101112
20080103040506070912
200904
20100204
201104