回答編集履歴

4

感想追加

2019/12/09 04:36

投稿

rubato6809
rubato6809

スコア1382

test CHANGED
@@ -87,3 +87,29 @@
87
87
  これで、上に書いた要初期化フラグを使うことなく、実行開始時に初期化が済んでしまう~~ので、これだけで解決する可能性もあります。~~
88
88
 
89
89
  少なくともPutとGetの対応が取れていない。初期化だけの問題じゃないね。先は長そうだw
90
+
91
+
92
+
93
+ ---
94
+
95
+
96
+
97
+ ボンクラでも大体わかりましたw。以下、感想です。答えなくても良いから考えてみて。
98
+
99
+ - コンパイルエラーが出ない程度には書ける。この段階では悪くない。
100
+
101
+ - でもやろうとしていることがヘン。データ構造、cache() 関数が何を返すか等、再考したほうが良い。
102
+
103
+ - キャッシュ中に見つかったエントリを、今後どう使いたいのか。
104
+
105
+ - エントリが空いてる・使っているの区別の付け方、エントリの探し方がいまいち重たい・分かりにくい・(バグってる?)感じ。
106
+
107
+ - cache()に渡す文字列の先頭2文字でput・getを指定するって、どうなの?その2文字も一緒にキャッシュするの?今のコードだとputした文字列を絶対探せない感じになってる。
108
+
109
+ - 素直なやり方は、もうひとつ引数を設けてput・getの操作を指定するか、put関数・get関数に分けるか、だと思う。関数を分ければ初期化関数は簡単に書ける。
110
+
111
+ - malloc() が使えたとしたら、どうしたかったのだろうか。
112
+
113
+ - キャッシュするデータが文字列なら <string.h> 系の strcmp(), strcpy() などを使うとか。
114
+
115
+ - 文字列なら "%c" 表示を繰り返すのでなく、"%s" で一気に表示しちゃえばすっきりするのに。

3

回答修正

2019/12/09 04:36

投稿

rubato6809
rubato6809

スコア1382

test CHANGED
@@ -58,7 +58,7 @@
58
58
 
59
59
 
60
60
 
61
- 、もしかすると、ここから本題?笑
61
+ 初期化につい
62
62
 
63
63
  cache[0] = &buffer1[0]; ですが、&buffer1[0] は配列の先頭アドレスですから配列名だけで ``` cache[0] = buffer1; ``` と書けます。
64
64
 
@@ -84,6 +84,6 @@
84
84
 
85
85
  ```
86
86
 
87
- これで、上に書いた要初期化フラグを使うことなく、実行開始時に初期化が済んでしまうので、これだけで解決する可能性もあります。
87
+ これで、上に書いた要初期化フラグを使うことなく、実行開始時に初期化が済んでしまう~~ので、これだけで解決する可能性もあります。~~
88
88
 
89
- 他にアドバイスしたいことがある。。
89
+ 少なくとPutGetの対応取れていない。初期化だの問題じゃないね先は長そうだw

2

再修正

2019/12/09 03:14

投稿

rubato6809
rubato6809

スコア1382

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

1

細部修正

2019/12/09 02:29

投稿

rubato6809
rubato6809

スコア1382

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- cache() 関数の中に、**初期化済みか否かを示す static なフラグ変数を設けるのが定石**じゃないでしょうか。そうすれば main() から初期化関数を呼ぶ必要はなくなります。質問者は一回だけ初期化したいのが何か分かってるでしょうから、細かくは書きませんが、
29
+ cache() 関数の中に、**初期化済みか否かを示す static なフラグ変数を設けるのが定石**じゃないでしょうか。そうすれば main() から初期化関数を呼ぶ必要はなくなります。質問者は一回だけ初期化したいのが何か分かってるでしょうから、細かくは書きませんが、
30
30
 
31
31
 
32
32
 
@@ -62,7 +62,7 @@
62
62
 
63
63
  cache[0] = &buffer1[0]; ですが、&buffer1[0] は配列の先頭アドレスですから配列名だけで ``` cache[0] = buffer1; ``` と書けます。
64
64
 
65
- さらに、buffer1[] 〜 buffer10[] は static な配列ですから、これらの先頭アドレス10個はリンク時に確定する「定数」です。よって、次のように書いて最初から初期化することができます。
65
+ さらに、buffer1[] 〜 buffer10[] は **static な配列ですから、これらの先頭アドレス10個はリンク時に確定する「定数」**です。よって、次のように書いて最初から初期化できます。
66
66
 
67
67
  ```C
68
68
 
@@ -70,7 +70,7 @@
70
70
 
71
71
  // (途中省略)
72
72
 
73
- static char buffer1[BUF_LENGTH] = "invalid";
73
+ static char buffer10[BUF_LENGTH] = "invalid";
74
74
 
75
75
  static char *cache[BUF_SIZE] = {
76
76
 
@@ -85,3 +85,5 @@
85
85
  ```
86
86
 
87
87
  これで、上に書いた要初期化フラグを使うことなく、実行開始時に初期化が済んでしまうので、これだけで解決する可能性もあります。
88
+
89
+ 他にもアドバイスしたことはあるけど。。。