teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

ソース追記

2018/10/07 11:28

投稿

cateye
cateye

スコア6851

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

加筆

2018/10/07 11:28

投稿

cateye
cateye

スコア6851

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)