ANSI Delphiで動く

version 0.9.3 のソースから古いコードを切り貼りして、とりあえず、ANSI Delphi で動くようにしました。

ただし、version 1.0 で行った最適化はすべて Unicode Delphi ありきなので、ANSI Delphi では遅いです。

ANSI Delphi での最適化は必要ですか?

必要ならば手を加えますが、必要でなければ Unicode Delphi の最適化に力を注ぎます。

ANSI Delphiで動く」への13件のフィードバック

  1. 福士

    小宮さん、こんにちは。福士と申します。
    SkRegExpの1.0.5のANSI部分にコンパイルが通らないところがありましたので報告させていただきます(メールのほうがよかったでしょうか?)。
    SkRegExpW.pasの2032行目、TRELiteralRepeatCode.IsEqual関数(ANSI)で、REStrLJComp関数呼出の第2パラメータがPWideChar(FString)となっているところはPWideChar(FStrings)だと思います(1.0.4ではそうなっているので)。
    あと大したことではありませんが、TRELiteralCode.IsEqual関数(ANSI)のローカル変数W1,W2,Lが未使用です。
    まだ全然使い込んでいない(というか、どう使うかを勉強中のレベル)のですが、気が付いたことがあったらまた報告させていただきます。
    ちなみにANSI版はあるに越したことはないけれど、途中でサポートが止まってしまってもしょうがないのかなぁ、と個人的には思っています。

    返信
  2. totonica

    小宮さんはじめまして、totonicaです。
    SkRegExpはUTF-16で駆動する数少ない正規表現だと思うので、
    是非Unicode版の方に力を注いで頂けると個人的にはありがたいです。
    他の正規表現ライブラリは大体UTF-8ばっかりなので・・・。

    返信
  3. 小宮秀一

    totonica さん、初めまして。
    実は、ANSI Delphi は気が向いたときにやることにして、Unicode Delphi の方をメインにすることにしました。
    ところで、「初めまして」とは言っても、私の方は一方的に存じ上げているのですが・・・いつも参考にさせていただいています。サイトの移転、ご苦労様でした。

    返信
  4. 小宮秀一

    福士さん、こんにちは。
    ご指摘ありがとうございます。早速修正して本日中に上げておきます。
    ANSI版については、申し訳ありませんが、あまり期待なさらないでくださいね。

    返信
  5. 福士

    1.0.5のANSI版なのですが、Delphi 2007上で他にも2つほど問題を発見してしまいました。
    1.デバッガ上でMatch[]などを評価するなどしてからターゲットを終了するとIDEに制御が戻ったところでアクセス違反が発生してデバッグ状態から抜けられなくなることがある(Delphi IDEはKill Processするしかなくなる)。
    2.何回かExpressionを変更しつつExecPosを(開始位置を移動しながら)実行していくとMatchに値が入らなくなる(ExecPosはTrueを返し、Match[0]には値が正しく入る)。
    どちらも0.9.3では問題ないので、ANSI版は0.9推奨、1.xはUnicode版のみと使い分けするほうがいいのかも(小宮さんの負担的にも)と思ったりします。

    返信
  6. 小宮秀一

    福士さん、ありがとうございます。
    1はANSI版だけの問題ではないような気がします。
    差し支えない範囲で結構ですので、問題のコードをshu(あっとまーく)k.email.ne.jpまで送っていただけないでしょうか。調べてみたいです。
    2は、Expressionを入れ替えながら使うのを想定していませんでした。チェックしてみます。

    返信
  7. 福士

    小宮さん、こんにちは。福士です。
    お言葉に甘えて検証用のプログラムをメールでお送りしました。
    まぁそういう作りは普通しないだろっていう気もするプログラムですが、まだ正規表現(とライブラリ)をどう使っていくのかをいろいろ勉強しているところですので…。
    ちなみに元データ(パースしたいもの)はMETAR(定時飛行場実況気象通報式)とよばれるものです。

    返信
  8. 福士

    小宮さん、こんにちは。福士です。
    Ver1.0.8ありがとうございます。
    Match[]に値が入らなくなる問題は解消しています。
    デバッガでMatch[]の値の評価を行うと終了後にアクセス違反が起きてデバッグ状態から抜けられない件は依然として発生しています。
    とりあえずの報告ということで。

    返信
  9. 小宮秀一

    福士さん、こんばんは。
    アクセス違反は同じですか・・・。
    私の環境では未だに発生しないのでちょっと途方にくれております。

    返信
  10. 福士

    小宮さん、こんにちは。福士です。
    放置も気持ち悪いので、もう少し追ってみました(1.0.10)。
    1.最初はinlineがまずいのではないかと思い、inlineを外してみましたが結果は変わらず。
    2.WideStringをヒント表示するとIDE側の問題でまずいのではと疑いMatch[]とGetMatchStrの型を(Ansi)Stringに変更してみましたが、これも外れ。
    3.RegExp.FMatchDataそのものを評価した場合は問題ないものの、RegExp.FMatchDataのプロパティを評価するとエラーになる。例えばRegExp.FMatchData.Countでも駄目。でもRegExp.FMatchData.FItems.Countは問題ない←いまここ。
    > 私の環境では未だに発生しないので
    Delphi 2007+DelphiSpeedUp 2.8の組み合わせで発現することを確認しました。ということはSkRegExpではなくDelphiSpeedUpの問題かもしれませんね。
    DelphiSpeedUp 2.8
    http://andy.jgknet.de/blog/?page_id=8
    そういうことであればKnown issueということで済ませてしまってもよいような気もします(無責任ですいません)。

    返信
  11. 小宮秀一

    福士さん、わざわざありがとうございます。
    >Delphi 2007+DelphiSpeedUp 2.8の組み合わせで発現することを確認しました。
    私の環境はWinXP(SP4)、Delphi2007(DecUpdate)で、DDevExtensionなのですが、DelphiSpeedUpは入れてませんでした。
    インストールして試してみます。
    やはり問題を残したままでは気持ち悪いですからね。

    返信
  12. 小宮秀一

    DelphiSpeedUPをインストールしたら、IDEがクラッシュする件再現しました。一歩前進です。でも、これは強敵そうです。

    返信

コメントを残す

メールアドレスが公開されることはありません。