回答編集履歴
4
感想追加
answer
CHANGED
|
@@ -42,4 +42,17 @@
|
|
|
42
42
|
};
|
|
43
43
|
```
|
|
44
44
|
これで、上に書いた要初期化フラグを使うことなく、実行開始時に初期化が済んでしまう~~ので、これだけで解決する可能性もあります。~~
|
|
45
|
-
少なくともPutとGetの対応が取れていない。初期化だけの問題じゃないね。先は長そうだw
|
|
45
|
+
少なくともPutとGetの対応が取れていない。初期化だけの問題じゃないね。先は長そうだw
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
ボンクラでも大体わかりましたw。以下、感想です。答えなくても良いから考えてみて。
|
|
50
|
+
- コンパイルエラーが出ない程度には書ける。この段階では悪くない。
|
|
51
|
+
- でもやろうとしていることがヘン。データ構造、cache() 関数が何を返すか等、再考したほうが良い。
|
|
52
|
+
- キャッシュ中に見つかったエントリを、今後どう使いたいのか。
|
|
53
|
+
- エントリが空いてる・使っているの区別の付け方、エントリの探し方がいまいち重たい・分かりにくい・(バグってる?)感じ。
|
|
54
|
+
- cache()に渡す文字列の先頭2文字でput・getを指定するって、どうなの?その2文字も一緒にキャッシュするの?今のコードだとputした文字列を絶対探せない感じになってる。
|
|
55
|
+
- 素直なやり方は、もうひとつ引数を設けてput・getの操作を指定するか、put関数・get関数に分けるか、だと思う。関数を分ければ初期化関数は簡単に書ける。
|
|
56
|
+
- malloc() が使えたとしたら、どうしたかったのだろうか。
|
|
57
|
+
- キャッシュするデータが文字列なら <string.h> 系の strcmp(), strcpy() などを使うとか。
|
|
58
|
+
- 文字列なら "%c" 表示を繰り返すのでなく、"%s" で一気に表示しちゃえばすっきりするのに。
|
3
回答修正
answer
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
// 以下は、呼びだされた時の通常処理
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
初期化について。
|
|
32
32
|
cache[0] = &buffer1[0]; ですが、&buffer1[0] は配列の先頭アドレスですから配列名だけで ``` cache[0] = buffer1; ``` と書けます。
|
|
33
33
|
さらに、buffer1[] 〜 buffer10[] は **static な配列ですから、これらの先頭アドレス10個はリンク時に確定する「定数」**です。よって、次のように書いて最初から初期化できます。
|
|
34
34
|
```C
|
|
@@ -41,5 +41,5 @@
|
|
|
41
41
|
buffer6, buffer7, buffer8, buffer9, buffer10,
|
|
42
42
|
};
|
|
43
43
|
```
|
|
44
|
-
これで、上に書いた要初期化フラグを使うことなく、実行開始時に初期化が済んでしまうので、これだけで解決する可能性もあります。
|
|
44
|
+
これで、上に書いた要初期化フラグを使うことなく、実行開始時に初期化が済んでしまう~~ので、これだけで解決する可能性もあります。~~
|
|
45
|
-
|
|
45
|
+
少なくともPutとGetの対応が取れていない。初期化だけの問題じゃないね。先は長そうだw
|
2
再修正
answer
CHANGED
|
@@ -42,4 +42,4 @@
|
|
|
42
42
|
};
|
|
43
43
|
```
|
|
44
44
|
これで、上に書いた要初期化フラグを使うことなく、実行開始時に初期化が済んでしまうので、これだけで解決する可能性もあります。
|
|
45
|
-
他にもアドバイスしたこと
|
|
45
|
+
他にもアドバイスしたいことがあるけど。。。
|
1
細部修正
answer
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
- char buffer1[]〜buffer10[]、10個の文字型(char型?)配列
|
|
13
13
|
- char *cache[BUF_SIZE]、即ち要素数10個のポインタ配列
|
|
14
14
|
|
|
15
|
-
cache() 関数の中に、**初期化済みか否かを示す static なフラグ変数を設けるのが定石**じゃないでしょうか。そうすれば main() から初期化関数を呼ぶ必要はなくなります。質問者は一回だけ初期化したいのが何か分かってるでしょうから、細かくは書きませんが、
|
|
15
|
+
cache() 関数の中に、**初期化済みか否かを示す static なフラグ変数を設けるのが定石**じゃないでしょうか。そうすれば main() から初期化関数を呼ぶ必要はなくなります。質問者は一回だけ初期化したいものが何か分かってるでしょうから、細かくは書きませんが、
|
|
16
16
|
|
|
17
17
|
```C
|
|
18
18
|
int cache(char *recvBuffer)
|
|
@@ -30,15 +30,16 @@
|
|
|
30
30
|
|
|
31
31
|
さて、もしかすると、ここから本題?笑
|
|
32
32
|
cache[0] = &buffer1[0]; ですが、&buffer1[0] は配列の先頭アドレスですから配列名だけで ``` cache[0] = buffer1; ``` と書けます。
|
|
33
|
-
さらに、buffer1[] 〜 buffer10[] は static な配列ですから、これらの先頭アドレス10個はリンク時に確定する「定数」です。よって、次のように書いて最初から初期化
|
|
33
|
+
さらに、buffer1[] 〜 buffer10[] は **static な配列ですから、これらの先頭アドレス10個はリンク時に確定する「定数」**です。よって、次のように書いて最初から初期化できます。
|
|
34
34
|
```C
|
|
35
35
|
static char buffer1[BUF_LENGTH] = "invalid";
|
|
36
36
|
// (途中省略)
|
|
37
|
-
static char
|
|
37
|
+
static char buffer10[BUF_LENGTH] = "invalid";
|
|
38
38
|
static char *cache[BUF_SIZE] = {
|
|
39
39
|
// 最初から初期化してしまえ
|
|
40
40
|
buffer1, buffer2, buffer3, buffer4, buffer5,
|
|
41
41
|
buffer6, buffer7, buffer8, buffer9, buffer10,
|
|
42
42
|
};
|
|
43
43
|
```
|
|
44
|
-
これで、上に書いた要初期化フラグを使うことなく、実行開始時に初期化が済んでしまうので、これだけで解決する可能性もあります。
|
|
44
|
+
これで、上に書いた要初期化フラグを使うことなく、実行開始時に初期化が済んでしまうので、これだけで解決する可能性もあります。
|
|
45
|
+
他にもアドバイスしたことはあるけど。。。
|