- 1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:06:26 ]
- malloc(sizeof(char)*(strlen(s)+1))
ではなく malloc(strlen(s)+1) と書くような糞コードばかり見て育った、 悪しき慣習を引きずった人は引退すべし
- 231 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:09:02 ]
- お前ら、こんな下らない話で、よくここまでスレを伸ばしたなぁ。
いまどきmallocとstrlenを散在させるようなコードを書くほうがオカシイ。 strlenなんて使うか? ふつー。
- 232 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:14:17 ]
- 最近はもうC自体あんまり使わない
- 233 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:23:27 ]
- >>231
話がループしてるからいくらでも伸びる気がする。 ところで、 「散在させる」ってのはどこから出てきた? strlenを使わないなら何を使う?(あくまでCだとして) sizeof(char)を省略すべきでない?
- 234 名前:!= 231 mailto:sage [2007/08/27(月) 01:25:34 ]
- ここでstrlen_sだなんて言ってみるテスト
- 235 名前:デフォルトの名無しさん [2007/08/27(月) 01:28:31 ]
- >>231
くだらないからこそだろう まさにこれこそが 「自転車置場の議論」 ってやつだな
- 236 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:35:19 ]
- >>233
マクロ、ライブラリ、クラスの中で使うのではなく、 ベタベタと書くコードの中で使う = 散在させる ぶっちゃけ、適切に局在化されていれば、 多少マズいコードだろうと直せるので、 このスレで話しているようなことは、 どーでもよくなるんですよ。
- 237 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:39:54 ]
- そうだ、マルチバイト文字が存在するからいけないんだ!
今日から、みんな、英語で生活! それで全員ハッピーだ!
- 238 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:57:57 ]
- Die job death car?
- 239 名前:233 mailto:sage [2007/08/27(月) 02:01:15 ]
- >>236
「散在させる」はスレの流れから読み取ったわけじゃないのね。 俺も同じ考えだけど、ちょっと論点がずれてる気がする。 「局在化」とか、「直せる」とかはこのスレには関係ないな。 局在化したその場所で「省略するかしないか」ってことが問われてる。 まあ、そこで、「どーでもよい」ってのが答えなんだろうけど。
- 240 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 04:21:09 ]
- ここで新たな判断基準を持ち込んでみる。
どちらが適切だと思うか主張する場合に、年収も書くこと。 年収の多い人のやり方が、すなわち、より成功に近い。
- 241 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 06:00:54 ]
- 馬鹿発生
- 242 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 09:04:13 ]
- アホが来たよ・・・
- 243 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 09:28:33 ]
- >>231
C言語なら「普通」strlenを使うと思う。 NULL終端までのバイト数を取得する関数なんて作るのは、 まぁライブラリの標準関数が使えないプロジェクトぐらいじゃないの?
- 244 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 11:19:52 ]
- 今時charの内部形式を意識しないといけない言語は使うな。
- 245 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 16:17:20 ]
- >>243
何かにつけてstrlenする、糞遅くて信頼性の低いプログラム書いてるのか。ご苦労さまです。
- 246 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 16:20:17 ]
- 本当、何かにつけてstrlenの必要に迫られるCは疲れるよ。
- 247 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 16:25:11 ]
- >>245
C厨だがそこには同意
- 248 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 17:18:47 ]
- strlen
- 249 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 17:23:02 ]
- struct {
size_t bufferLen ; size_t validLen ; char szBuffer[1] ; } ; とかの構造体を使って、バッファの長さや有効長を管理したらいいじゃないか。 szBuffer[1]と言いながら、実際にはヒープから長い領域を貰うのは気持ちわるいかもしれないが。
- 250 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 17:36:12 ]
- >>245
自分がそうだからといって人もそうだとは限りません。 間抜けですね。
- 251 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 18:10:40 ]
- >>249
そこまでするくらいならC++使う。そもそも使えるときは使っている。
- 252 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 19:11:38 ]
- >>250
どんなコードを書いているのか披露してほしい。お手本にするから。
- 253 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 20:09:30 ]
- >>245
fgetsで文字列を読み込んだり、コマンドライン引数を受け取ったりした際に 得られた文字列長を調べるための、strlenより高速で信頼性のある方法を教えてくれまいか?
- 254 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 20:59:09 ]
- freadを使う
- 255 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:05:14 ]
- それはstrlenより高速で信頼性のある方法なのか?
- 256 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:29:46 ]
- >>253
まず、得られた文字列の長さを調べる必要が、本当にあるのかな。 次に、何かにつけてfgetsするのかな。
- 257 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:32:02 ]
- 必要あるからする
- 258 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:34:11 ]
- 本当は必要ないのに、必要だと思い込んでいる可能性を疑ってみた?
- 259 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:37:49 ]
- もちろん
- 260 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:38:54 ]
- で、strlenより高速で信頼性のある方法は?
- 261 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:44:29 ]
- じゃぁ>>253は具体的にコードを例示してね。
- 262 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:50:37 ]
- strlenより高速で信頼性のある方法マダー?
- 263 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:53:02 ]
- strlenよりも高速で信頼性のあるstrlen互換の関数の話ではないぞ。
- 264 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:55:18 ]
- 基本的に、
気やすくstrlenやstrcpyを使わない ってだけで、かなり速くなるし、安全性も高まる。
- 265 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:59:45 ]
- 酷い例1
char buf[100] ; char buf2[100] ; fgets(buf, sizeof(buf), pFin) ; if (strlen(buf) < sizeof(buf2)) { /* 無意味な長さチェック */ strcpy(buf2, buf1) ; /* ←無意味なコピー */ } 酷い例2 for (i=0 ; i<strlen(s) ; i++) { /* 無意味な有限回数のループ、無意味な毎度の関数呼び出し */ if (s[i] == 'X') { なんたら } }
- 266 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:02:14 ]
- strlenよりも高速で信頼性のあるstrlen互換の関数マダー?
- 267 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:07:14 ]
- >>264
strlen,strcpyの安全性が低く感じるのは、呼び出し元の安全性が低いから。 速くなるってのは、一度取った長さを変数に入れておくとかってレベルの話かな? いずれにしろ、これらに限らず「安易に使わない」って意味では同意できる。
- 268 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:25:48 ]
- >>267
> strlen,strcpyの安全性が低く感じるのは、呼び出し元の安全性が低いから。 人間はミスをするものだから、 機械的かつ強制的にチェックしなければ、 意味がない。 バッファの長さが十分であるという、 目に見えない約束なんてものは、 人間のミスには耐えられない。 > 速くなるってのは、一度取った長さを変数に入れておくとかってレベルの話かな? そんな小手先の最適化ではなく、 strlenを本当に必要な場所でしか使わない、ということ。
- 269 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:28:11 ]
- 安易に使わないってどゆこと?
必要だから使うんじゃないか。代替手段があるというのか?
- 270 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:29:30 ]
- >>269
実際にどんなコード書いてるの? 晒してみなよ。
- 271 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:30:02 ]
- 253だが、257とか259とか俺じゃないんだが。
なんか>>261に指名されたんで、釣られてちょろっと書いてみる。 エラー処理が抜けてるのは行数削減のため。 引数に与えた文字列から始まる行を表示するプログラム。 fgetsでは無くて、引数の文字列長を取得する例なんで、 簡単のために最大255文字。 #include <stdio.h> #include <string.h> #define BUF_SIZE 256 int main(int argc, char *argv[]) { int len = strlen(argv[1]); char buf[BUF_SIZE]; FILE *fp = fopen("test.txt", "r"); while ((fgets(buf, BUF_SIZE, fp)) != NULL) { if(strncmp(argv[1], buf, len) == 0) printf("%s", buf); } } strlenぐらい普通に使うと思うんだけどねぇ。
- 272 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:32:33 ]
- なんかボーっとしてる間に、えらいスレ進んでてびっくりだ。
253と271とコレ以外は俺じゃないんで一応。
- 273 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:36:16 ]
- >>271
それは 「何かにつけてstrlenする」 には該当しないと思うが。
- 274 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:37:17 ]
- >>272
すまんね >>257と>>259は俺だ 君の振りをしたつもりは無いんだけどね
- 275 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:50:29 ]
- こんなどうでもいいことを真剣に議論してるw
ワラタw
- 276 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:53:27 ]
- それはよかった
- 277 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:55:12 ]
- >>273
>>243に対して>>245だったから、strlenを全否定してるように見えたんで、 「まぁ使うんじゃないの?」ぐらいの感じで書いただけだよ。 ループ内とかで同じ文字列に対して何度もstrlen呼んだりとか そういうのは無駄だと思うよ。
- 278 名前:デフォルトの名無しさん [2007/08/28(火) 22:18:22 ]
- 結論は出ましたか。
- 279 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 22:23:56 ]
- 結論:
sizeof(char)は省略してもいい strlenは必要な場合もある
- 280 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 22:28:44 ]
- 上げんな糞
>>1死ね
- 281 名前:デフォルトの名無しさん [2007/08/28(火) 23:30:57 ]
- adobePの新作期待age
- 282 名前:デフォルトの名無しさん [2007/08/28(火) 23:46:39 ]
- >>1
sizeof(char)が必ず1なら malloc(sizeof(char)*(strlen(s)+1)) ではなく malloc(strlen(s)+1) の方がいい malloc(sizeof(char)*(strlen(s)+1)) だとsizeof(char) * が冗長 sizeof(char)が必ずしも1でないならわかるが
- 283 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:23:30 ]
- まあCとC++に限って言えば100% 1だからなぁ
- 284 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:26:43 ]
- いい加減ループしすぎ。
- 285 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:27:14 ]
- まぁスレタイがねループしてくださいって言ってるようなもんだからね
- 286 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:29:27 ]
- ループといえば for(;;) と while() の戦争もあったな
オレは意味なくdo〜while派だけど
- 287 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:38:39 ]
- じゃあ俺はgotoを使うぜ!
- 288 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:41:03 ]
- 三木は3つまでしかまとめられなかったので 3岐
後藤は5匹を統括してたから 5統
- 289 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 06:16:09 ]
- ナツカシス
- 290 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 06:40:54 ]
- ネオジオは100メガビット
- 291 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 07:43:01 ]
- >>288
三木は右手だからじゃなかったっけ?
- 292 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 11:02:31 ]
- それもあるな
なんかこう言葉遊びもあそこまで行くと芸術レベルだよな
- 293 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 13:07:42 ]
- >>284
今頃ノコノコ出てきて画期的なご意見を述べて行かれる >>282 みたいな間抜けがいる限り、ループは不滅です。
- 294 名前:デフォルトの名無しさん [2007/08/29(水) 21:26:11 ]
- exit(0);
- 295 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 21:49:41 ]
- いまどきマロックなんか使うかよw
newを使えnewを!
- 296 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 22:22:16 ]
- VirtualAllocは多用しますが何か?
- 297 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:13:24 ]
- sizeof(char)+1が必ず2でも、省略すべきではない
pc11.2ch.net/test/read.cgi/tech/1187521586/
- 298 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:20:02 ]
- 再帰
- 299 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 19:28:14 ]
- おもしろいことに、関心と一般の議論の大きさは、
機能の重要性と反比例していることが多い。 その理由は、大きな機能より小さな機能のほうが明確な意見を持ちやすく、 流行のような、一時的な関心を引きやすいからだ。 〜〜Bjarne Stroustrup『C++の設計と進化』
- 300 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 22:41:51 ]
- >>299
そして、プログラムとは、小さな機能を集めて大きな機能を実現していく。 だから、小さな機能を議論することは、最終的に大きな機能 そして、重大な機能を議論することにつながるのである。
- 301 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 23:39:17 ]
- ああいえば上祐
- 302 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 00:56:46 ]
- ttp://msdn2.microsoft.com/ja-jp/library/xa1a1a6z(VS.80).aspx
世界一巨大なソフトウェア会社のコーディング例では、 len = _vscprintf( format, args ) // _vscprintf doesn't count + 1; // terminating '\0' buffer = malloc( len * sizeof(char) ); のように、sizeof(char)を省略していない。
- 303 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:34:46 ]
- dist.dc.kumamoto-u.ac.jp/~km3534/12/index.html
の問題2 「自分なりの理由」があればどちらでも良い。 という答えな気がする。
- 304 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:41:50 ]
- >>303
純真な若者に示す手本として、 s = (char *)malloc(sizeof(char)*n + 1); というのは、随分と酷いな。 s = (char *)malloc(n + 1); ならともかく、 s = (char *)malloc(sizeof(char)*n + 1); はダメだろう。 意味として間違ってる!
- 305 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:50:23 ]
- >>304
まあね、書くのならこのスレの様に sizeof(char)*(n+1) のようにヌル文字分も含めるべきだね。
- 306 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:53:05 ]
- >>303
どうしようもない問題集だな。特に問題4の辺りは終わっている。
- 307 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 02:23:04 ]
- 演習3のプログラムも酷い。
例とはいえ、freeしないのは、どうかと。 それに、stdio.hしか#includeしてないぞ!!!
- 308 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 02:37:23 ]
- >>303のURLのソースを見ると、スタイルシート"masato.css"を使ってる。
ttp://www.kumamoto-u.ac.jp/ のトップページでmasatoを検索すると、 ttp://www.syst.cs.kumamoto-u.ac.jp/~masato/pe2/index.html がヒットする。似たようなセンスの問題が。 ttp://www.syst.cs.kumamoto-u.ac.jp/~masato/pe2/02/index.html の問題4は、>>303の演習3と似てる。 そして問題5は、 > 友情をテーマに,mallocと構造体を使った簡潔なプログラムを作りなさい. という、涙が出そうな秀逸な問題だ。 ちなみに、URLを削って ttp://www.syst.cs.kumamoto-u.ac.jp/ という研究室のWebのメンバーを見ると、助手らしい。 熊本大学だいじょうぶか? こんな質の低い教育やってちゃイカんぞ。
- 309 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 02:49:46 ]
- だって、Apache インストール済みだもん。
ttp://dist.dc.kumamoto-u.ac.jp/
- 310 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 04:12:25 ]
- ttp://www.syst.cs.kumamoto-u.ac.jp/~masato/pe2/02/index.html
> 問題2 > 以下のプログラムを見て,問に答えなさい. > #include <stdio.h> > #include <stdlib.h> > > #define SIZE 5 > > int main() > { > int a[SIZE], i; > int *b = (int *)malloc(sizeof(int)*SIZE); > > for (i = 0; i < SIZE; i++) > a[i] = i * i; > > for (i = 0; i < SIZE; i++) > b[i] = a[i]; > > for (i = 0; i < SIZE; i++) > printf("%d ", b[i]); > printf("\n"); > > return 0; > }
- 311 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 04:12:51 ]
- >
> 1. 「配列aとmallocで確保された領域bの違いは, > 静的に確保されるメモリ領域と, > __に確保されるメモリ領域という違いがある.」 > __に入る適切な言葉を以下から選びなさい. > > a.愛ゆえ > b.俺的 > c.仮想的 > d.動的 > > 2. b[2]の型は何ですか?
- 312 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 04:15:56 ]
- これは問題の間違いを正しなさい、という課題なのかな。
配列aが「静的」だってよ。
- 313 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 04:16:42 ]
- さらに、for文の書き方が酷い。
同一行に書くのなら {} を省いても構わないが、 別の行に書くのなら {} は省くべきではないのに。
- 314 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 05:30:37 ]
- sizeof(char)の話に集中しましょうね。
大学のプログラミング演習の課題を添削するスレ pc11.2ch.net/test/read.cgi/tech/1188501699/
- 315 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 09:32:49 ]
- >>302
そういうことやってるから細かいバグが残ったりなかなか取れなかったり するんだろ。しっかりしろといいたい。
- 316 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 09:37:52 ]
- そうだな。
+1を人間がコーディングしていたら、+1し忘れて、バッファオーバーフローするわな。
- 317 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 10:12:40 ]
- 世界一安定してる会社のコーディングスタイルならともかく、バグだらけの会社のそれを例に出されてもな
- 318 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 10:13:47 ]
- >>317
コード量が膨大だから、バグ含有率が低くても、バグ件数は膨大になるんだよ。
- 319 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 12:19:34 ]
- >>318
ああいうコードが積み重なってるからね バグが多くなるのもうなずけるよ・・・
- 320 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 13:30:54 ]
- >>302
ほんと、あそこのサンプルコードってゴミばっかりだよな。 >>313 お前の推奨するスタイルなんかどーでもいいわけだが。
- 321 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 15:12:04 ]
- また1つごみを見付けたんで記念カキコ
msdn2.microsoft.com/ja-jp/library/y0cka9es(VS.80).aspx pszSrc= new char(12); if(pszSrc) pszSrc= "Hello world!";
- 322 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 15:41:38 ]
- >>321
酷すぎるww その前にあるNULL代入も意味無いしw constもキャストもないからコンパイルも通らんだろうなw
- 323 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 15:52:20 ]
- 何がやりたいのかよくわかんねーソースだな
- 324 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 16:31:06 ]
- >>321
あれだな、 1.まず鍋を用意します。 2.次に鍋を投げ捨てます。 3.そして既に作っておいたカップラーメンを食べます。 みたいな感じか。 それにしても僅か8行でツッコミ所満載な上に メモリリークのおまけ付きとか流石マイクロソフトだな。
- 325 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 16:36:02 ]
- >>321
非NULLは真になるよって言いたいんじゃまいか
- 326 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 16:36:14 ]
- せめてnew char[12]と書けよと思う。
- 327 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 17:10:02 ]
- strcpyしたかったのかな。"Hello world!"で12文字だからnew char[12]じゃ足りないけど。
str.CopyChars(str.GetBuffer(), "Hello world!", 12); と書いとけばいいのにw
- 328 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 19:35:39 ]
- >>321は良い踏み絵だな
判ってない奴が浮き出てきた
- 329 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 20:59:23 ]
- charというのは組込型ではなくクラスなのか?
- 330 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 21:23:47 ]
- >>328
何が?
- 331 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 21:24:49 ]
- >>329
ATL/MFC のコードなんだから C++。 なので char はクラスではない。
|

|