←前へ 次へ→ 機能別Q&A 質問番号順Q&A 秀丸エディタQ&A集トップ

[HMM0075A]

●浮動小数点数版秀丸との互換性

Q. 浮動小数点数バージョンの秀丸でマクロを実行すると、これまで通常の秀丸で動作していたマクロの一部が誤動作するのですが、互換性が無いのでしょうか?。

A. 浮動小数点数バージョンの秀丸は、秀丸マクロの数値型変数に、浮動小数点数を格納できるようにしたものです。
マクロの文法は、数値 (リテラル) の書き方以外は100%互換がありますが、
  1. 浮動小数点数版のほうが扱える数値の範囲が広い(小数も使える、大きい/小さい値を使える)ので、通常版の数値の仕様におさまらない場合があります。
  2. 通常版の秀丸の仕様である、数値型変数に整数しか入らないことを前提としたコーディングをしているマクロは、誤動作する可能性があります。

前者は比較的単純な話で、例えば、
#i = 1.5 ;
というのは浮動小数点数版では正常なコーディングですが、通常版ではエラーになります。
また、通常版秀丸では、4 バイトの符号付き整数(-2147483647〜+2147483648) なので、極端に大きい/小さい値を扱っている場合、浮動小数点版では問題ないが通常版秀丸では値がおかしくなります。

後者の例としては、/ (除算)の演算結果を変数に格納すると、通常版秀丸では整数の商が入り、余りが切り捨てられます。しかし、浮動小数点数版秀丸では、小数まで含んだ解が入ります。
その除算の結果をもとに条件判定すると、通常版と浮動小数点数版とで動作が異なる場合が出てきます。

以下の例は、#space個の半角スペースを$spaceに格納する例です。単にループして半角スペースを1個ずつ足していくよりも、以下のようにしたほうが秀丸マクロでは実行速度が出ます。
以下のコーディングでは、通常版では正しく動作しますが、浮動小数点数版で動作させると、whileループが意図したよりも1回多く回ることになります。
例えば #space == 10 の場合、#space / 80 == 0 であり、whileループの中のコードは実行されないというのが意図している動作です。浮動小数点数版では、#space / 80 == 0.125 であるため、whileループの中のコードが1回実行されてしまいます。

$space = "";
#sp1 = #space / 80;
#sp2 = #space % 80;
while (#sp1 > 0) {
$space = $space + $space80;
#sp1 = #sp1 - 1;
}
$space = $space + leftstr($space80, #sp2);

通常版も浮動小数点数版も同様に動作させるための方法は、意図している動作とロジックの関係で、必ずしも一概にはいえませんが、この例の場合、while文を

while (#sp1 >= 1) {
と変更することで、通常版も浮動小数点数版でも同様に動作するようになります。
あるいは、常に整数の商を得るため、
#sp1 = (#space - (#space % 80)) / 80;
としてもよいでしょう。

←前へ 次へ→ 機能別Q&A 質問番号順Q&A 秀丸エディタQ&A集トップ