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

回答編集履歴

4

感想追加

2019/12/09 04:36

投稿

rubato6809
rubato6809

スコア1384

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

回答修正

2019/12/09 04:36

投稿

rubato6809
rubato6809

スコア1384

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
+ 少なくとPutGetの対応取れていない。初期化だの問題じゃないね先は長そうだw

2

再修正

2019/12/09 03:14

投稿

rubato6809
rubato6809

スコア1384

answer CHANGED
@@ -42,4 +42,4 @@
42
42
  };
43
43
  ```
44
44
  これで、上に書いた要初期化フラグを使うことなく、実行開始時に初期化が済んでしまうので、これだけで解決する可能性もあります。
45
- 他にもアドバイスしたことあるけど。。。
45
+ 他にもアドバイスしたことあるけど。。。

1

細部修正

2019/12/09 02:29

投稿

rubato6809
rubato6809

スコア1384

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 buffer1[BUF_LENGTH] = "invalid";
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
+ 他にもアドバイスしたことはあるけど。。。