HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0726
logarithumスタック領域のオーバーフローの回避4解決


logarithum

リンク

2007/7/26(Thu) 10:33:32|NO.9746

HSPで再帰を試してみるために、こんな関数を作ったのですが、
	#module
#defcfunc sum int n /*nまでの0を除くすべての自然数の逆数の和*/ if n=0 :return -1 if n=1 :return 1 return 1.0/n + sum(n - 1) #global

nが63の時にスタック領域のオーバーフローが出ます。
この関数はまだ非再帰で実装することもできますが、
あくまで再帰のテストなのでそれは抜きとしてお願いします。



この記事に返信する


logarithum

リンク

2007/7/26(Thu) 10:36:41|NO.9747

間違えて、宣伝になってしまいました。
どうか気にしないでください。



naznyark

リンク

2007/7/27(Fri) 01:54:12|NO.9785

HSPシステムの仕様上の限界によるものなので
ユーザー定義命令・関数、gosub を使った再帰処理では
このエラーの発生を根源的に回避することはできません。

 自前でスタックを用意してループで再帰的処理を
行うなどの方法で代替してください。



logarithum

リンク

2007/7/27(Fri) 08:32:39|NO.9788

そ、そんなあ...
HSP側で8086命令のpush-popで引数を渡すような実装をしてはくれないんですか?



naznyark

リンク

2007/7/28(Sat) 01:12:24|NO.9830

質問ではなく要望でしたか?
それならおにたまさんにメールしてみては?

いちおう自前での再帰処理の場合。

//---------------------------------------------------------------------------- #ifndef __M_NS_GOSUB__ #define global __M_NS_GOSUB__ //-------------------------------------------------------------- #module __M_NS_GOSUB #deffunc SetRetStat@__M_NS_GOSUB var p1 return p1 #define global ns_gosub( %1 ) \ %ttag_ns_gosub \ ns_stack@__M_NS_GOSUB( ns_sublev@__M_NS_GOSUB ) = *%i : ns_sublev@__M_NS_GOSUB++ : \ goto %1 : *%o #define global ns_return( %1 = stat ) \ ns_retstat@__M_NS_GOSUB = %1 : SetRetStat@__M_NS_GOSUB ns_retstat@__M_NS_GOSUB : \ ns_sublev@__M_NS_GOSUB-- : goto ns_stack@__M_NS_GOSUB( ns_sublev@__M_NS_GOSUB ) #global //-------------------------------------------------------------- ;dimtype ns_stack@__M_NS_GOSUB, vartype( "label" ), 256 #endif //---------------------------------------------------------------------------- #define pushparam( %1 ) _param( ns_sublev@__M_NS_GOSUB + 1 ) = %1 #define curparam _param( ns_sublev@__M_NS_GOSUB ) pushparam 100 ns_gosub *sum mes refdval stop *sum if ( curparam = 0 ) { ns_return -1.0 } if ( curparam = 1 ) { ns_return 1.0 } pushparam curparam - 1 ns_gosub *sum ns_return 1.0/curparam + refdval



ONION software Copyright 1997-2023(c) All rights reserved.