キューから特定データを全て消去する | てすとぺーじ v0.0.8

キューから指定データを全て削除して、その分だけ詰めなおすアルゴリズムを記載します。


ソースコード

ここで、d_event_queue はあるイベントが詰まっているキューです。
空き領域には 0xFFu が詰まっているものとします。

27,28,29行目の効果により効率は良いと思います。
動作はかなりデバッグしたんで大丈夫だと思います、よ。
(1個もキューになくても、いっぱいまで詰まっていても問題ないです)

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.
typedef unsigned char   uchar;
typedef unsigned int    uint;
‌ 
// ====== イベントキュー(0xFFが最後を示す)
uchar   d_event_queue[] = { 0x01u0x02u0x01u0x03u0x04u0xFFu0xFFu0xFFu };
‌ 
‌ 
void    func_erase_event( uchar avEvent )
{
    // ====== キューのサイズ(最大要素数)
    uint    myEventCount    = sizeof(d_event_queue) / sizeof(d_event_queue[0]);
    // ====== 詰めた数
    uint    myPutCount      = 0u;
    // ====== 有効データ長
    uint    myValidLength   = myEventCount;
    // ====== 以下作業領域
    uint    i;
‌ 
    // ==============================================================
    //  指定イベントを全てクリアし、その分繰り上げる
    // ==============================================================
    for( i=0u; i<myEventCount; i++ ){
‌ 
        // ==============================================================
        //  もうこの先イベントがないなら終了
        // ==============================================================
        if0xFFu == d_event_queue[i] ){
            // ====== 有効データ長をここまでとする(詰めなおすのはここまでで良い)
            myValidLength   = i;
            break;
‌ 
        // ==============================================================
        //  指定イベントがあったなら無視
        // ==============================================================
        } else if( avEvent == d_event_queue[i] ){
            //  Nothing to Do!!
‌ 
        // ==============================================================
        //  指定イベントと違うイベントがあったなら詰めなおし
        // ==============================================================
        } else {
            d_event_queue[ myPutCount ] = d_event_queue[i];
            myPutCount++;
        }
    }
‌ 
‌ 
    // ==============================================================
    //  不要部分を塗りつぶす
    // ==============================================================
    for( i=myPutCount; i<myValidLength; i++ ){
        d_event_queue[ i ]  = 0xFFu;
    }
}
このコードは CodePublisher で生成しています

 

実行結果

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
// ====== 実行例1
uchar d_event_queue[] = { 0x01u0x02u0x01u0x03u0x04u0xFFu0xFFu0xFFu };
‌ 
func_erase_event( 0x01u );
// 実行後のd_event_queueの中身
//  d_event_queue = { 0x02, 0x03, 0x04, 0xFFu, 0xFFu, 0xFFu, 0xFFu, 0xFFu }
‌ 
‌ 
‌ 
// ====== 実行例2
uchar d_event_queue[] = { 0x01u0x02u0x01u0x03u0x04u0x03u0x03u0x04u };
‌ 
func_erase_event( 0x03u );
// 実行後のd_event_queueの中身
//  d_event_queue = { 0x01, 0x02, 0x01, 0x04u, 0x04u, 0xFFu, 0xFFu, 0xFFu }
‌ 
このコードは CodePublisher で生成しています

コメント

  • コメントはまだありません。

コメントを投稿する

コメントを投稿する場合は以下に注意してください。

・記事に関係する内容であること
・特別な理由がない限り「全体公開」であること

これさえ守っていただければどんな内容でも投稿可能です。
皆様の質問やコメントは他の方の問題解決に繋がりますのでご協力ください。

コメント投稿フォーム
名前
メール
URL
コメント
閲覧制限

コメントを投稿するには、以下の問題に答えてください。
問題:「このサイト名をカタカナ六文字にして入力してください」