キューから指定データを全て削除して、その分だけ詰めなおすアルゴリズムを記載します。
ソースコード
ここで、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; |
|
|
uchar d_event_queue[] = { 0x01u, 0x02u, 0x01u, 0x03u, 0x04u, 0xFFu, 0xFFu, 0xFFu }; |
|
|
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++ ){ |
|
|
|
|
if( 0xFFu == d_event_queue[i] ){ |
|
myValidLength = i; |
break; |
|
|
|
|
} else if( avEvent == d_event_queue[i] ){ |
|
|
|
|
|
} else { |
d_event_queue[ myPutCount ] = d_event_queue[i]; |
myPutCount++; |
} |
} |
|
|
|
|
|
for( i=myPutCount; i<myValidLength; i++ ){ |
d_event_queue[ i ] = 0xFFu; |
} |
} |
|
実行結果
1. |
2. |
3. |
4. |
5. |
6. |
7. |
8. |
9. |
10. |
11. |
12. |
13. |
14. |
15. |
16. |
|
|
uchar d_event_queue[] = { 0x01u, 0x02u, 0x01u, 0x03u, 0x04u, 0xFFu, 0xFFu, 0xFFu }; |
|
func_erase_event( 0x01u ); |
|
|
|
|
|
|
uchar d_event_queue[] = { 0x01u, 0x02u, 0x01u, 0x03u, 0x04u, 0x03u, 0x03u, 0x04u }; |
|
func_erase_event( 0x03u ); |
|
|
|
|