subroutine の再起呼び出しNo.01294
ひろ さん 00/04/04 11:56
 
 皆さん今日は、ひろです。
 つかぬことを伺いますが、秀丸 macro の subroutine は C 言語の関数の
ように再起呼び出しは出来るのでしょうか?

[ ]
RE:01294 subroutine の再起呼び出しNo.01295
番頭++ さん 00/04/04 12:16
 
>ように再起呼び出しは出来るのでしょうか?

簡単なテストでは動きますが、
すべてのマクロをテストしたことはありません。

想像ですが、スタックがある限り動き続けるのだと思います。

//*5    A1.MAC - 2000/04/04
    call abc;
endmacro;
abc:
    ##i = ##i + 1;
    question time + " - " + str(##i);
    while( result ){
        call abc;
    }
    message time + " - " + str(##i);
return;

//*5    A2.MAC - 2000/04/04
    call abc 0;
endmacro;
abc:
    ##i = ##1 + 1;
    question time + " - " + str(##i);
    while( result ){
        call abc ##i;
    }
    message time + " - " + str(##i);
return;


[ ]
RE:01295 subroutine の再起呼び出しNo.01297
ひろ さん 00/04/04 18:26
 
 番頭++ さん今日は、ひろです。
> 簡単なテストでは動きますが、
 わざわざ test していただき有り難うございました。

> 想像ですが、スタックがある限り動き続けるのだと思います。
 help に
> callされたサブルーチンからさらにサブルーチンを呼ぶこともできます。
> 最高20回程度重複可能です。
との記述があるので、stack が残っていればこの程度は出来るという理解で
宜しいでしょうか? --> 秀丸担当様

[ ]
RE:01295 subroutine の再起呼び出しNo.01302
安久津 さん 00/04/05 13:37
 
ひろさん、番頭++さん こんちにちは、安久津です。

>想像ですが、スタックがある限り動き続けるのだと思います。
これは、その確認です。

// 再帰コールでスタックの上限テスト。
// 始まり、
  #__SIZE__ = 10; // 配列サイズ
  $__DATA__ = "実際は310バイトの文字列をここに入れて下さい。";
  ##size = 20 * strlen($__DATA__) * #__SIZE__;
  $$mes = str(#__SIZE__)+" "+str(strlen($__DATA__))+" 20 ="+str(##size);
  setclipboard $$mes + "\ncall: ";
  #__CALL__ = 1;
  call recursiveSub;
  message "サイズ " + str(##size) + " で成功です。";
  title 0;
endmacro;
recursiveSub:
  ##i = 0;
  while( ##i < #__SIZE__ ){
    $$s[##i] = $__DATA__;
    ##i = ##i + 1;
  }
  title str(#__CALL__);
  addclipboard str(#__CALL__) + ", ";
  #__CALL__ = #__CALL__ + 1;
  if( #__CALL__ <= 20 ) call recursiveSub;
return;
// 終り。

●(1)テスト1
 各変数の初期値 #__SIZE__ = 10; $__DATA__="310バイトの文字列";
 結果
10 310 20 =62000
call: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
 成功のメッセージが出る。

●(2)テスト2
 各変数の初期値 #__SIZE__ = 11; $__DATA__="310バイトの文字列";
 結果
11 310 20 =68200
call: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
 成功のメッセージが出ない。

●(3)テスト3
 各変数の初期値 #__SIZE__ = 10; $__DATA__="320バイトの文字列";
 結果
10 320 20 =64000
call: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
 成功のメッセージが出ない。

●備考。
「テスト2」と「テスト3」では、マクロが途中で終了しているのか否かが、
判然としません。成功のメッセージが出ない場合には、常駐秀丸も含めて
全ての秀丸を終了させないと思わぬときに「メモリーが足りないので終了します」
というメッセージに出くわします。
わざと、#__SIZE__ = 20; とかにして、何回かマクロを実行します。
#何回かマクロを実行できます!!!
しばらくして、「メモリーが足りないので終了します」が連続して出ます。

●再帰サブルーチンのおおまかな要件。
(1)再帰サブルーチンを呼出す前に使用している全変数のバイト数 B
(2)再帰サブルーチンを呼出す前の call の使用回数 C
(3)再帰サブルーチンで初期化(宣言)する全グローバル変数のバイト数 g
(4)再帰サブルーチンで使用する全ローカル変数のバイト数 b

 B + g + ( b * ( 20 - C ) ) < 64000
 場合によっては、動作環境で変わるかもしれません。

●execmacro について。
 a.mac から、再帰サブルーチンを含む b.mac を execmacro した場合、
 call の使用回数は、a.mac での使用回数を含みます。
 蛇足ですが、秀丸Ver3.xx では、Ver2.xx に比べて call の回数チェックが
 厳しくなったような気がします。

ではでは。

[ ]
RE:01302 subroutine の再起呼び出しNo.01303
番頭++ さん 00/04/05 14:15
 
> 蛇足ですが、秀丸Ver3.xx では、Ver2.xx に比べて call の回数チェックが
> 厳しくなったような気がします。

いつも想像というか、無責任なコメントですみません。
call のネスト nest の最大値 max. は 20 みたいなんです。
そのときに ## $$ とかの処理で 64K の制限が在るような動きです。

そうなのでしょうか ??? ==> 秀丸担当 様

[ ]
RE:01297 subroutine の再起呼び出しNo.01305
秀丸担当 さん 00/04/06 15:39
 
>> 最高20回程度重複可能です。
>との記述があるので、stack が残っていればこの程度は出来るという理解で
>宜しいでしょうか? --> 秀丸担当様

これは、スタックとは関係ありません。
秀丸内で20回分のネストができるだけ確保してあり、20回を越えると
エラーになります。

[ ]