自身を呼び出すサブルーチンのNESTNo.07479
rosegardenyk さん 14/10/15 14:39
 
マクロ初心者の rosegardenykです。
マクロのHELPには「callされたサブルーチンからさらにサブルーチンを呼ぶこともで
きます。最高20回程度重複可能です。」とあります。
うろ覚えですが、下位に自身を含むサブルーチン呼ぶことも可能だったと思います。
だだし、下記のようなサブルーチンで Indicator を ON にしないと、「call の nes
t が深すぎます」というエラーが発生します。
ONにすると、エラーは発生せず、自身を含む call の nest をうまく処理してくれて
いるように見えます。

こんな作戦でよろしいでしょうか、よい案がありましたらご教示ください。

Main:
  ・
call SUB_JJ $$My;
  ・
endmacro;  
// $$1: $$My ##2: Indicator ///////////////////
SUB_JJ:
  ・
 if (!##2) call Find_Word $$Hy;
  ・
return $$xxx;
// $$1: $$Hy ///////////////////
Find_Word:
  ・
 call SUB_JJ $$Ky, 1;
  ・
return $$yyy
//////////////////////////

[ ]
RE:07479 自身を呼び出すサブルーチンのNENo.07480
秀まるお2 さん 14/10/16 00:20
 
 誰からもコメントが無いようなので僕の方でコメントすると…。

 そういう作戦でいいんじゃないかと思います。

 僕だと、

Sub:
    //ネストチェック
    if( #sub_nest != 0 ) {
        //ネストしてるので何もしない
        return;
    }
    #sub_nest = 1;
    ...
    ... 実際の処理
    ...
    #sub_nest = 0;
    return;

 みたいにすることが多いかなぁと思いますが、グローバル変数を1つ使うのが
あんまり良くないし、returnする前に#sub_nestを0クリアし忘れるバグが出やす
いとか、欠点もあります。rosegardenykさんのやり方の方がその点ではいいかと
思います。

 ただ、秀丸マクロ程度で再帰呼び出しを使う必要性は、滅多に無い気はします。

[ ]
RE:07480 自身を呼び出すサブルーチンのNENo.07481
rosegardenyk さん 14/10/16 07:26
 
早速のお返事ありがとうございます。
> ただ、秀丸マクロ程度で再帰呼び出しを使う必要性は、滅多に無い気はします。
やはり、秀丸マクロのヘルプでは「再帰呼び出し」に触れられてていないんでしょう
ね? なら、うろ覚えの元は昔々読んだ 林 晴比古著の「C言語入門」あたりなのかな…
この「滅多に無い」ことが、実際の秀丸マクロ作成中に必要になってしまったもので
すから、不安になりましたが、秀丸まるお2さんのお返事見て「再帰呼び出し」は秀
丸マクロでも、必要ならやっても良いし、変な処理結果にもならないと理解できまし
た。 どうもありがとうございました。


[ ]