回答編集履歴
2
ソース追記
answer
CHANGED
@@ -35,4 +35,97 @@
|
|
35
35
|
//
|
36
36
|
注意:書き込み用のインデックスが読み出し用のインデックスを追い抜かないようにして下さい。さもないと、文字列を格納したアドレスが上書きされて、開放できなくなります。free()したらポインタをクリアすればどのデータが残っているか判定できます。
|
37
37
|
考え方:a[10]という配列がある場合、a[9]の次はa[0]になるわけですからインデックスが9になったら0にしてやればいいだけです。
|
38
|
-
参考:[リングバッファ](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%90%E3%83%83%E3%83%95%E3%82%A1)
|
38
|
+
参考:[リングバッファ](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%90%E3%83%83%E3%83%95%E3%82%A1)
|
39
|
+
「追記」
|
40
|
+
遅くなりましたが^^; たぶん動くw
|
41
|
+
```c
|
42
|
+
usr~/test/c % ./a.out 11 22 33 44 55 6666 77 8888 99 00 aaaaaaa bb cc ddddddd ee ff
|
43
|
+
./a.out
|
44
|
+
11
|
45
|
+
22
|
46
|
+
33
|
47
|
+
44
|
48
|
+
55
|
49
|
+
6666
|
50
|
+
77
|
51
|
+
8888
|
52
|
+
99
|
53
|
+
00
|
54
|
+
aaaaaaa
|
55
|
+
bb
|
56
|
+
cc
|
57
|
+
ddddddd
|
58
|
+
ee
|
59
|
+
ff
|
60
|
+
count:0
|
61
|
+
usr~/test/c % cat main.c
|
62
|
+
#include <stdio.h>
|
63
|
+
#include <stdlib.h>
|
64
|
+
#include <string.h>
|
65
|
+
//
|
66
|
+
typedef struct {
|
67
|
+
int count;
|
68
|
+
int rInx;
|
69
|
+
int wInx;
|
70
|
+
char *ptr[8];
|
71
|
+
} ringBuf;
|
72
|
+
//
|
73
|
+
enum { SET = 1, FULL = 0, EMPTY = 0 };
|
74
|
+
//
|
75
|
+
static int wQ(char *str, ringBuf *bPtr)
|
76
|
+
{
|
77
|
+
if (bPtr->ptr[bPtr->wInx]) {
|
78
|
+
return FULL;
|
79
|
+
}
|
80
|
+
bPtr->ptr[bPtr->wInx] = malloc(strlen(str) + 1);
|
81
|
+
strcpy(bPtr->ptr[bPtr->wInx], str);
|
82
|
+
//
|
83
|
+
bPtr->wInx = (bPtr->wInx + 1) & 0x07;
|
84
|
+
//
|
85
|
+
bPtr->count++;
|
86
|
+
//
|
87
|
+
return SET;
|
88
|
+
}
|
89
|
+
//
|
90
|
+
static char *rQ(ringBuf *bPtr)
|
91
|
+
{
|
92
|
+
char *ptr = bPtr->ptr[bPtr->rInx];
|
93
|
+
if (ptr == 0) {
|
94
|
+
return EMPTY;
|
95
|
+
}
|
96
|
+
//
|
97
|
+
bPtr->ptr[bPtr->rInx] = 0;
|
98
|
+
bPtr->rInx = (bPtr->rInx + 1) & 0x07;
|
99
|
+
//
|
100
|
+
bPtr->count--;
|
101
|
+
//
|
102
|
+
return ptr;
|
103
|
+
}
|
104
|
+
//
|
105
|
+
int main(int agc, char *agv[])
|
106
|
+
{
|
107
|
+
ringBuf rbf;
|
108
|
+
rbf.rInx = rbf.wInx = rbf.count = 0;
|
109
|
+
for (int i = 0; i < 8; i++) {
|
110
|
+
rbf.ptr[i] = 0;
|
111
|
+
}
|
112
|
+
//
|
113
|
+
for (int i = 0; i < agc; i++) {
|
114
|
+
if (wQ(agv[i], &rbf) == SET) {
|
115
|
+
char *str = rQ(&rbf);
|
116
|
+
if(str != 0){
|
117
|
+
puts(str);
|
118
|
+
free(str);
|
119
|
+
}
|
120
|
+
}
|
121
|
+
}
|
122
|
+
//
|
123
|
+
printf("count:%d\n",rbf.count);
|
124
|
+
//
|
125
|
+
return 0;
|
126
|
+
}
|
127
|
+
usr~/test/c %
|
128
|
+
```
|
129
|
+
char *ptr[8]; ←バファのサイズ
|
130
|
+
bPtr->rInx = (bPtr->rInx + 1) & 0x07; ←0〜7を生成(2^n)をマスクする常套手段。
|
131
|
+
・・・今のコンパイラは偉いから普通のif文で最後まで行ったら0に戻しても可d^^
|
1
加筆
answer
CHANGED
@@ -31,4 +31,8 @@
|
|
31
31
|
|
32
32
|
usr~/test/c %
|
33
33
|
```
|
34
|
-
あとは、ポインタの配列をリングバッフにするだけです。
|
34
|
+
あとは、ポインタの配列をリングバッフにするだけです。
|
35
|
+
//
|
36
|
+
注意:書き込み用のインデックスが読み出し用のインデックスを追い抜かないようにして下さい。さもないと、文字列を格納したアドレスが上書きされて、開放できなくなります。free()したらポインタをクリアすればどのデータが残っているか判定できます。
|
37
|
+
考え方:a[10]という配列がある場合、a[9]の次はa[0]になるわけですからインデックスが9になったら0にしてやればいいだけです。
|
38
|
+
参考:[リングバッファ](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%90%E3%83%83%E3%83%95%E3%82%A1)
|