[ 新規に投稿する ]

「変換リストによる置換」の仕様No.09931
山紫水明 さん 19/07/06 13:57 [ コメントを投稿する ]
 
秀まるおさん,
 「変換リストによる置換]で置換するとき(マクロではない),ある文字全部
を削除しようとして変換先文字列を空欄にした時に「変換元または変換先文字列
が空かまたは区切り文字が入っていない行があります」というエラーメッセージ
が出ます。
 これは仕様でしょうか?

              山紫水明
[ ]
RE:09931 「変換リストによる置換」の仕様No.09934
秀まるお さん 19/07/08 08:23 [ コメントを投稿する ]
   ソースコードを見た限りはそういう仕様のようで、メッセージを回避する用のオプション類は無いようです。

 変換先文字列は別に空でもダメなことは無いので、変換先についてはメッセージ表示しないように直してもいいですが、どうでしょうか。直すのは簡単ですけども。
[ ]
RE:09934 「変換リストによる置換」の仕様No.09935
山紫水明 さん 19/07/08 09:31 [ コメントを投稿する ]
   秀まるおさん,

> 変換先文字列は別に空でもダメなことは無いので、変換先についてはメッ
>セージ表示しないように直してもいいですが、どうでしょうか。直すのは簡単
>ですけども。

https://www.maruo.co.jp/turukame/4/#00559
の投稿で気づいたのですが,拙作マクロでは,正規表現などのオプションが無い
場合,HmfListReplace.hmf がインストールしてあればスピードアップのために
自動的にそちらを使うことになっています。
 マクロでリストをチェックするよりも,変換モジュールの方を直していただい
た方がよさそうなので,修正お願いします。

                    山紫水明
[ ]
RE:09935 「変換リストによる置換」の仕様No.09937
秀まるお さん 19/07/08 11:36 [ コメントを投稿する ]
   今アップロードしました。

https://hide.maruo.co.jp/lib/hmconv/hmflistreplace140.html

 テストもしたので大丈夫だと思います。

 区切り文字が無い場合はエラーになります。
[ ]
RE:09937 「変換リストによる置換」の仕様No.09940
山紫水明 さん 19/07/08 21:32 [ コメントを投稿する ]
   秀まるおさん,

> 今アップロードしました。

 確認しました。ありがとうございました。

                    山紫水明
[ ]
RE:09937 「変換リストによる置換」の仕様No.09941
colder さん 19/07/09 03:31 [ コメントを投稿する ]
  細かいバグが3点ほど見つかりました。

1.置換方向が「右 ⇒ 左」のとき、変換元文字列が空でもエラーにならず、
変換先文字列が空のとき、エラーになる。

2.変換元または変換先の文字列が長すぎるときのエラーメッセージが
「ユニコード文字で256文字以下でないとダメです。」とあるが、256文字のときにも出る。

3.特定のパターンで、秀丸が異常終了する可能性がある。

変換元の文字列が200文字で、変換先の文字列が201文字で、
変換対象に変換元の文字列が大量にある場合、異常終了します。
意図的じゃない限り、まず起こらないと思うけど。
[ ]
RE:09941 「変換リストによる置換」の仕様No.09943
秀まるお さん 19/07/09 09:20 [ コメントを投稿する ]
   colderさんの鋭いご指摘毎度ありがとうございます。3点とも状況理解して修正させていただきます。

 ソースコードレビューだけで見つけられたんだと思いますけども。

 3番目の件は

int     nEnlargeBy100Temp = (cchConv2 * 100 + 99) / cchConv1;     //切り上げ

 となってた切り上げの式がバグで、

int     nEnlargeBy100Temp = (cchConv2 * 100 + cchConv1 - 1) / cchConv1;     //切り上げ

 で正解ということで、一応そういう修正をしつつ、変換先のバッファオーバーしてないか確認する処理も念のため追加させていただきます。
[ ]
RE:09943 「変換リストによる置換」の仕様No.09944
秀まるお さん 19/07/09 11:22 [ コメントを投稿する ]
   今アップロードしました。

 切り上げの計算ミスは他のソースコードにもあるかもしれないので、

   \+ .+ \) / 

 でgrepして他のソースコードも探してみたんですが、一応大丈夫そうでした。というか、切り上げは他ではやって無くて、四捨五入の計算が多々ありましたが、一応大丈夫そうでした。

int cPoint = ( ( ( pTextMetrics->tmHeight - pTextMetrics->tmInternalLeading ) * 72 * 10 ) + sy / 2 ) / sy;
[ ]

[ 新規に投稿する ]