秀丸のマクロの行数の制限?No.26255
Makkie さん 09/02/27 22:02
 
秀丸担当殿

Makkie と申します。教えてください。

秀丸のマクロの行数(というかサイズ)には、何らかの制限があ
るのでしょうか?

ちょっと困った問題が起きています。

 ・自分で作ったマクロ(A)を問題なく使っていた。
 ・Aを修正して10数行追加した。
 ・そうすると、マクロ実行時に「数値を指定すべきところが数
    値でない」というメッセージが出て、マクロが終了した。こ
    れは再現性がある。
 ・しかし、実際に見てみると「数値を指定すべきところが数
    値でない」ことはない。正しくコーディングされている。
 ・さらに文を追加したり修正したりすると、マクロの実行制御
    がおかしくなったり(サブルーチンのリターンで、変なとこ
    ろに制御が渡る)、「内部エラー」というようなメッセージ
    がでることがあった(これらは再現できてません)

秀丸ユーザとしての経験上、今までこういうことはなかったの
で、じっくり考えてみると、今までにない要素としてはマクロA
が長大だということがあります(5000行以上)。それで「何
らかの制限があるのでは」と疑った次第です。なお変数領域の制
限についてはヘルプに書かれていますが(640KB)、これに
引っかかるようなことはないはずです。よろしくお願いします。
秀丸7.07(XP)です。

[ ]
RE:26255 秀丸のマクロの行数の制限?No.26259
Iranoan さん 09/02/28 22:41
 
 Makkie さん今日は、Iranoan です。
> 秀丸のマクロの行数(というかサイズ)には、何らかの制限があ
> るのでしょうか?
 いずれ秀丸担当さんのお返事があるとは思いますが、私も手元で試して見ま
した。
 何らかの制限はあるようで、極端に大きなファイル・サイズのマクロでは、
仰る事は起きませんが、
〜: バッファがオーバーしました。
とエラーになることがありました。更に大きくすると、落ちました。
 ただし、単純に何行以上、ファイル・サイズ何バイト以上といった制限では
なさそうです。おそらく内部コードに変換した時点のデータ量ではないかと。
 また
> 秀丸7.07(XP)
との事なので、正式最新版 Ver.7.10 では何か違いがあるかも知れません。
 なお私が確認したのは、Ver.7.11β1 浮動小数点数版です。

 あと現状で何かバグがあるとしても、マクロを幾つかのファイルに分けて、
execmacro 文を使って呼び出すようにすれば、回避できるかもしれません。

 以下、確認です。
>  ・Aを修正して10数行追加した。
この追加した部分だけを抜き出して、別のマクロにしても
>  ・そうすると、マクロ実行時に「数値を指定すべきところが数
>     値でない」というメッセージが出て、マクロが終了した。
は再現するんですよね。

>  ・さらに文を追加したり修正したりすると、マクロの実行制御
>     がおかしくなったり(サブルーチンのリターンで、変なとこ
>     ろに制御が渡る
 ラベル名が重なっていませんか? 重なってもエラーにはならないので。

[ ]
RE:26259 秀丸のマクロの行数の制限?No.26279
秀丸担当 さん 09/03/02 12:13
 

調べてみたところ、マクロファイルは、コンパイル後の中間コードのサイズが
256KBまでという制限がありました。
マクロファイルに書かれた文字列の文は2,3バイトから数バイトのコードに変換
されるので、640KBのファイルは内部的にはコンパイル後に256KBくらいになって
いるかもしれないです。

もし問題無く動いているとすれば、「バッファがオーバーしました。」というメ
ッセージが表示されるはずなのですが、もしかしたらバッファ超えのチェックが
不十分な箇所があるのかもしれないです。
そうだとしたら申し訳ありません。
こちらではいまのところ再現できていないのですが、Iranoanさんに別途報告を
頂いているので、調査させていただきます。

現状では、Iranoanさんの言われている通り、マクロを分けることが出来る箇所
をexecmacro文で呼び出すようにすると回避できるかもしれません。

[ ]
RE:26279 秀丸のマクロの行数の制限?No.26283
Makkie さん 09/03/02 16:50
 
秀丸担当殿

追加情報です。

 ・秀丸7.10でも同一現象(XP)です。再現性があります。
 ・問題のマクロ:Aは、コメントをいっさいはずした状態で、ファイ
    ル上サイズが165KB(5200行程度)です。
      中間コードが256KB以下だとすると、どうコンパイルして
        も256KB以下だと思うので、単純にサイズが大きいという
        問題でもないような気がします。

 ・「文字列が指定されるべきところに文字列以外のものが指定されて
    いる」というメッセージは、サブルーチンに制御が渡るタイミング
    で出ているようです。
            ・
            ・
            ・
          message "STOP 1";
          call XXX ........;
            ・
            ・
            ・
          XXX :
          message "STOP 2";
            ・
            ・
            ・
    "STOP 1"のメッセージが出た後、"STOP 2" のメッセージは出ずに
    「文字列が指定されるべきところに文字列以外のものが指定されて
    いる」というエラーになり、マクロが終了します。

        なお、最初の投稿で「数値が指定・・・・」と書いたのは「文
        字列が指定・・・」の誤りでした。

 ・必要でしたら、なんらかの情報を採取して送ります。

 ・なお、マクロを2つ以上にわけると、共通に使われているサブルー
    チンを重複してもつことになるので、管理上めんどうになって、や
    りたくないところです。

[ ]
RE:26283 秀丸のマクロの行数の制限?No.26285
秀丸担当 さん 09/03/02 17:41
 

情報ありがとうございます。

> ・秀丸7.10でも同一現象(XP)です。再現性があります。
> ・問題のマクロ:Aは、コメントをいっさいはずした状態で、ファイ
>    ル上サイズが165KB(5200行程度)です。

ということは、この問題とは違うようです。
>
> ・「文字列が指定されるべきところに文字列以外のものが指定されて
>    いる」というメッセージは、サブルーチンに制御が渡るタイミング
>    で出ているようです。

これをヒントに、おそらくですが、わかりました。
call文の飛び先が、内部的な中間コードにして64Kを超える位置に飛ぼうとする
と、失敗しているようです。
これは問題でした。申し訳ありません。
修正する必要がありそうです。
以前から問題だったようで、V7.11ではわからないですが、少なくともV8.00を出
すときには修正させていただきます。

現状で回避するには、ダミーのラベルを32個作ると回避できるようです。
64Kの範囲の飛び先を32個までキャッシュしていて、32個を超えるとキャッシュ
しないので飛べるようになると思います。

マクロ先頭に
DummyLavel1:
DummyLavel2:
DummyLavel3:
  :
DummyLavel32:

というようにしてみるのが最も安全かもしれないですが、
問題のラベルが現れるまでに32個のサブルーチンがあればいいと思います。
既に幾つかのサブルーチンがあるのであれば、数個のダミーでいいかもしれませ
ん。



[ ]
RE:26285 秀丸のマクロの行数の制限?No.26286
Makkie さん 09/03/02 22:43
 
秀丸担当殿

Makkie です。

おっしゃるように、ダミーのラベルを32個、マクロの先頭に
作ったところ、まったく正常に動作しました。

秀丸の修正を待っております。


[ ]
RE:26286 秀丸のマクロの行数の制限?No.26536
Makkie さん 09/05/09 18:46
 
秀丸担当殿

Makkie です。

7.11 で修正されていることを確認しました。
ありがとうございました。

 (実は、エラーとなったマクロを追加・修正してしまったので
  7.10 で再現できなくなっていまい、報告が遅れました。
  さらにその後修正を続けているとエラーが発生しだしたの
  で、7.11 での修正が確認できました。何となく、飛び先が
  離れすぎているという条件に別の条件もあったような気が
  しました)

[ ]