|
ひろさん、番頭++さん こんちにちは、安久津です。
>想像ですが、スタックがある限り動き続けるのだと思います。
これは、その確認です。
// 再帰コールでスタックの上限テスト。
// 始まり、
#__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 の回数チェックが
厳しくなったような気がします。
ではでは。
|
|