hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
システムのスタックを使わないgosub - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

Module

(HSP3.1)

システムのスタックを使わないgosub

goto 命令とラベル型変数を使った gosub, return の互換命令を使用可能にします。
標準の gosub 命令と異なりシステムのスタックを使わないのでメモリの許す限り多重呼び出しができます。

モジュール

filemod_nsgosub.hsp
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//(mod_nsgosub.hsp)===========================================================
 
//	mod_nsgosub.hsp
//	author : naznyark
 
//	goto とラベル型変数を使った gosub, return の互換命令。
 
//	標準の gosub 命令と異なりシステムのスタックを使わないので
//	メモリの許す限り多重呼び出しができます。
 
//(module part start)---------------------------------------------------------
 
#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 )
 
#define global    ns_sublev    ns_sublev@__M_NS_GOSUB
 
#global
 
//--------------------------------------------------------------
 
    dimtype ns_stack@__M_NS_GOSUB, vartype( "label" ), 256
 
#endif
//(module part end)-----------------------------------------------------------
 
//(test part start)-----------------------------------------------------------
#if 0
 
    // 再帰呼び出しのテスト。
    // メモリの許す限り再帰できます。
    maxlev = 0
    limlev = 100
    mes "test start"
    ns_gosub *test
    mes "test end"
    stop
 
*test
    if ( maxlev < ns_sublev ) { maxlev = ns_sublev : title "" + maxlev }
    if ( maxlev < limlev ) { ns_gosub *test }
    ns_return
 
#endif
//(test part end)-------------------------------------------------------------
//(EOF)=======================================================================

コメント

添付ファイル:
filemod_nsgosub.hsp
371件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-07-28 (土) 02:32:15 (2325d)