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

ラボ

リングバッファ

データ構造

※「リングバッファ」という名前のデータ構造ではない。
リングバッファとは、要素を円形に並べた構造のこと。言い換えると、リスト(配列など)の、「末尾の次」が先頭になるようにしたもののこと。
例えば、要素数が 4 の配列なら、(4) は範囲外なので、使用できない。しかし、これをリングバッファにすると、(4) は「末尾の次」なので、(0) と同一のものを指す。

キューへの適用

キューをリングバッファにした時の話。
値の追加は末尾に対してだが取り出しという操作があるかどうか分からなかったのでアレンジした。
通常のキューは、待ち行列が満杯で、かつ拡張できないときは、既存の要素を取り出さない限り、新たに要素を追加することができないが、これをリングバッファにすると、先頭の要素を追い出して追加する (実装から言うと、新たな要素が先頭の要素を上書きする)。
普通のキュー古い要素を優先するのに対して、こちらは新しい要素を優先すると言えるかもしれない。

実装例

fileRingBuffer[sp].as
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
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
!
-
|
|
|
!
 
 
 
 
 
 
 
-
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
/******************************************************************************
 *                                                                            *
 *                         データ構造:リングバッファ                         *
 *                                                                            *
 *   リスト構造の一種で要素の追加をリストの先頭のみで行うデータ構造。         *
 *   スタックとの違いは配列の添え字が循環する点。                             *
 *   ※正確にはリングバッファというデータ構造はないのかも知れない・・・。        *
 *     なので少しアレンジしています。                                         *
 *                                                                            *
 ******************************************************************************/
    #module "ring"
    ; ______________________________________________________________________
    ;/ リングバッファを登録する
    #deffunc ring_ini val
        mref rslt,64
        mref ring,48
        mref pval,1024
        head=0
        tail=0
        rslt=pval.2
        return
    ; ______________________________________________________________________
    ;/ リングバッファから値を取り出す
    #deffunc dering val
        mref rslt,64
        mref n,16
        if (pval.2=0)|(tail==head){
            rslt=1
        }
        else{
            n=ring.head
            head=head+1\pval.2
            rslt=0
        }
        return
    ; ______________________________________________________________________
    ;/ リングバッファに値を追加する
    #deffunc enring int
        mref rslt,64
        mref n,0
        if pval.2=0 : rslt=1 : goto *@f
        if(tail+1\pval.2)==head{
            head=head+1\pval.2
        }
        ring.tail=n
        tail=tail+1\pval.2
        rslt=0
*@
        return
    #global
/* -------------------------------------------------------------------------- *
 *                           S A M P L E                           *
 * -------------------------------------------------------------------------- */
    randomize
    ; 最初にリングバッファを登録しないでリングバッファに対して操作をしてみる
    enring 1
    if stat : mes "リングバッファに追加できませんでした."
    dering a
    if stat : mes "リングバッファから取り出せませんでした.\n"
 
    gosub *leftclick
 
    ; ここから正しい(?)使い方
    dim ary,5+1
    ring_ini ary
    mes "リングバッファのサイズ ==> "+stat+"\n"
 
    repeat 3
        wait 1
        rnd r,100 : enring r
        mes "リングバッファに入れた値 ==> "+r
    loop
 
    gosub *get
    gosub *leftclick
 
    repeat 8
        wait 1
        rnd r,100 : enring r
        mes "リングバッファに入れた値 ==> "+r
    loop
 
    gosub *get
    stop
 
*get
    ; リングバッファから取出す
    mes ""
    repeat
        wait 1
        dering n
        if stat{
            mes "\nリングバッファから取り出せませんでした.\n"
            break
        }
        mes "リングバッファから取り出した値 ==> "+n
    loop
    return
 
*leftclick
    mes "左クリックで画面クリア."
    repeat
        wait 1
        stick key,0,1
        if key=256 : break
    loop
    cls
    return

利用例

コメント

  • うむむむむ・・・。 -- kz3 2005-07-23 10:52:49 (土)
  • キューから引っ張ってきたままの部分をリングバッファに直しました^^; -- kz3 2005-07-23 23:14:44 (土)
  • 「リングバッファ⇒キュー」とは限らない(配列や連結リストなどの場合もある)ので、修整。後、実装例は hsp2.x のままでいいのでしょうか。

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

添付ファイル:
fileRingBuffer[sp].as
607件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2010-04-03 (土) 20:31:49 (1344d)