- 1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:06:26 ]
- malloc(sizeof(char)*(strlen(s)+1))
ではなく malloc(strlen(s)+1) と書くような糞コードばかり見て育った、 悪しき慣習を引きずった人は引退すべし
- 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 はクラスではない。
- 332 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 23:56:30 ]
- >>328
>>327みたいな奴の事だろう
- 333 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 01:06:20 ]
- >>332
>>327みたいな奴は何がわかってないの?
- 334 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 02:00:21 ]
- >>328
よく判ってないんで、>>321のソースを解説してはくれまいか?
- 335 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 11:25:14 ]
- // 動的に確保した領域のポインタをpszSrcに代入
pszSrc= new char(12); // newに成功した場合 if(pszSrc) // 動的に確保した領域を無視して、文字列リテラルのポインタをpszSrcに保存 // 動的に確保した領域はリークする pszSrc= "Hello world!"; C言語しか分からんけど、newをmallocに読み替えるとこんなところ。 C++だと文字列リテラルの代入は、なんかstrcpyみたいな動きすんのか?
- 336 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 11:36:12 ]
- >// 動的に確保した領域のポインタをpszSrcに代入
>pszSrc= new char(12); 構文エラー。 >// newに成功した場合 >if(pszSrc) newはNULLを返さない。 >// 動的に確保した領域を無視して、文字列リテラルのポインタをpszSrcに保存 >// 動的に確保した領域はリークする >pszSrc= "Hello world!"; その通り。 >C言語しか分からんけど、newをmallocに読み替えるとこんなところ。 >C++だと文字列リテラルの代入は、なんかstrcpyみたいな動きすんのか? しないしない。 >>324 寧ろ、こう。 ・鍋を用意して一杯にお湯を沸かします(勿論、麺を入れたら溢れて大変ですね)。 ・鍋は用意できましたか(当然である)? ・ではこちらに用意したカップラーメンをどうぞ(おいおい、鍋そのままw)。
- 337 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 12:01:38 ]
- >>335
pszSrc= new char(12); は、C だと↓こんな感じ。 (pszSrc = malloc(1)) = 12;
- 338 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 12:02:26 ]
- あああ尻穴忘れた!
*(pszSrc = malloc(1)) = 12;
- 339 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 12:15:23 ]
- >>336
12はcharの初期化子として有効。エラーにはならない。
- 340 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 15:08:20 ]
- エレガントなメモリリークだなぁ
- 341 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 04:22:12 ]
- mallocが失敗する可能性は考慮しないのか?
つーか、mallocってNULL以外が返ったとしても 実はメモリ確保に成功したかどうか不明だという おそろしいバグがあるんだがLinuxって怖いよな
- 342 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 08:06:28 ]
- mallocやnewが失敗する状況って、かなりヤバいよね。
それらに対処するコードで、mallocやnewを使うと、ミイラ取りがミイラになる恐れがあるし、 OSの仮想メモリを食い尽くしている状況では、他のプログラムも動作続行が厳しくなっていて、 終了処理も正常に行えるか怪しい。予想もつかないような事態が次々に発生しそう。 だから、mallocやnewに失敗した時点で、OSから再インストールするハメになるわけで、 成功したかどうかチェックし、失敗したことがわかったところで、ろくに対処できないなら、 開き直って、mallocやnewをラップして、失敗したらexitしてしまい、 ラップしたものを使う側は、失敗することはないものとしてコードを書いてしまうのもアリかと。
- 343 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 09:14:15 ]
- >だから、mallocやnewに失敗した時点で、OSから再インストールするハメになるわけで、
おいおい、普通はrebootで充分だろ。 実際Gnomeなんか使っていると、malloc()に失敗する頃には事実上操作不能になっているから、 諦めてとっととexit()ってのはありだと思う。 私の仕事関係では、常駐型アプリケーションの起動は基本的にスクリプトから行ない、 アプリケーションが異常終了したときには可能ならそのアプリケーションを再起動するようにしている。
- 344 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 09:42:29 ]
- >>343
rebootで十分という保証があれば、ね。 OSの上で走るすべてのプログラムが、 設定やデータをファイルに書く時、 一貫性を保てるように書いてくれればいいが、 そうでないと、 不正で壊れたファイルを読むことになり、 こまったことになってしまう。
- 345 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 13:09:01 ]
- OSからとかねぇよw
書き込み中の電源断でさえジャーナルファイルシステムなら通常問題無いのに、 メモリ確保失敗くらいで整合性取れなくなるとかw 基幹システムなどなら、ソフトウェアとして既に品質に問題有りだし、 個人PCやグループサーバーレベルで再インストは潔癖過ぎだろ。
- 346 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 13:13:01 ]
- 1GiBのメモリ確保しようとして失敗したって状況なら、
メモリ確保失敗したとユーザに通知したり、 そのために数KiBのメモリを確保したりしようとしてもいいと思う。
- 347 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 13:32:25 ]
- >>345
ファイルシステムのレベルで問題がなくても、ファイルの中身のレベルでは問題だよ。 ファイルの中身までトランザクションやジャーナルでやっていれば大丈夫だが、 そうでないプログラムの場合、ファイルの中身の一貫性が失われてしまう。
- 348 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 13:56:19 ]
- >>347
>そうでないプログラムの場合、ファイルの中身の一貫性 345の下2行の通り。 重要なシステムなら論外、DBMSなどで一貫性の確保は必須だし、 それでも抜けた異常はバックアップからリカバリさせる。 OSからとかダウンタイム長すぎだろ。 それにメモリ不足でOS壊すってどんな状況? viがLILOの設定ファイル書き換える最中に死んだって、 書き換え前にバックアップくらいしてるだろ。 ユーティリティか何かがhttpd.conf壊したって、 OSどころかapacheから入れなおす馬鹿は居ないだろ。
- 349 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 16:41:48 ]
- >ユーティリティか何かがhttpd.conf壊したって、
>OSどころかapacheから入れなおす馬鹿は居ないだろ。 見たことあるな。 俺はこれをWindows病と名づけた。
- 350 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 18:53:50 ]
- あーいるいる、「取り敢えず再インストールしてみました」って香具師。
- 351 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:36:44 ]
- ネトゲのクライアントは、たまにWindowsの設定やらシステムファイルやらをぶち壊す奴が居る
- 352 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:37:39 ]
- あ、補足。
多分mallocは関係ない。
- 353 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 21:53:13 ]
- しばらく前、幻想三国志2っちゅーゲームでアホほど再起動かかってOSが不安定になった。
再起動の原因がメモリリークと気付くのが遅すぎた・・・。 HDDがガリガリ鳴り出したらセーブして再起動とか、 偽典女神転生を思い出して懐かしかった。
- 354 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:57:44 ]
- 突然だがスレを激しくrollbackしていいかな。
sizeof(char)は確かに仕様で1と決まっているけど、省略しない方が良い。 コメントやsizeof(char)==1の理解が無くても、 ソースを見るだけで文字数→バイト数として扱いたい意図が明確になる。 それにコンパイラの最適化でどうせコストは0だ。 ただ、そんな冗長なソースが散在しているのが嫌だというのも同意出来る。 しかしそれ以前に、文字列の操作なんて普通はラップしないか? >malloc(sizeof(char)*(strlen(s)+1)) >malloc(strlen(s)+1) 両方とも、非常に短い関数以外でこんなん出てきたらどうかと思うんだが。 char* strmalloc(int len){return len<0?NULL:malloc((len+1)*sizeof(char ));} wchar_t* wcsmalloc(int len){return len<0?NULL:malloc((len+1)*sizeof(wchar_t));} void strfree(const char* s){free(s);} // 確保/解放を対とするためfreeを単純にラップ void wcefree(const wchar_t* s){free(s);} // 確保/解放を対とするためfreeを単純にラップ char* s2 = strmalloc(strlen(s)); strfree(s2); これくらいは抽象化するだろ?お前らどうやってる?
- 355 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:21:41 ]
- >文字数→バイト数として扱いたい意図
ここは自明だろーがよ というのが反対派の意見だと思う。 a++; // 1を足す っていうコメントを読まされるような感じ というか
- 356 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:28:41 ]
- >>354
一方俺はC++を使った。
- 357 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:49:03 ]
- まぁ、俺も現実的にはC++使うな。
だけどC++使うからこそ観念的に省略しないんだけどな。 テンプレート関数とか作るとき > ここは自明だろーがよ > というのが反対派の意見だと思う。 そのはずの自明が、抽象化・総称化すればする程無くなっていく。 wchar_tの対応をしようとしただけで崩れる。 つまりその自明はあまり本質的でなかったということ。 むしろ、文字をchar型を扱うときに限り文字数とバイト数が同じになる、と考える。 文字列操作と言いながら型を強く意識するのは、やはりスマートとは思えないよ。
- 358 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:52:00 ]
- 誤記は脳内保管で。
- 359 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:00:44 ]
- >>357
ぶっちゃけ未対応ソフトの多バイト文字対応をするときは charをwchar_tに機械変換♥ なんて絶対しないから もうその辺はすごい勢いでどうでもいい話だと思う。
- 360 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:11:32 ]
- そもそも文字型が独立しておらず、charやunsigned charが
整数型の1つである(JavaやC#でいうbyteにあたる型)という時点から もう文字とバイトをごっちゃにするのは始まっている。 だから俺は文字 == バイトを甘んじて受け入れ、sizeof (char)を使わない。
- 361 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:15:20 ]
- 機械変換とかじゃなくて、テンプレート関数の話な。
allocator((Tr::getlen(s)+1) * Tr::char_size); みたいな感じで実装して、型はコンパイル時に決まる。 ちょっとした関数を総称化すると、 自分が自明だとか本質的だと思っていたものが、 そうでもないと気付かされるって話。
- 362 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:18:56 ]
- ぶっちゃげcharだけなんてXMLも扱えねぇよ最近。
- 363 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:28:46 ]
- >>360
文字とバイトがごっちゃというのは整理出来ていないから。 文字は文字集合として独立していて、バイトも文字集合とは関係無い。 その2つを繋いで、バイト列の上で文字を表現するルールがエンコーディング。 概念が頭の中で分かれていれば、unsinedだとかSJIS, UTF-8やらがあってもごっちゃにはならないはず。
- 364 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:30:07 ]
- 型について、ちょい脱線するけど・・・。
時刻を保持する型を使ってて、8月中のデータを探すとき (擬似コード。リテラルは変数に代入された値と思って) if("2007/08/01" <= x && x <= "2007/08/31 23:59:59"){...} のように書く奴が居る。 俺は if("2007/08" <= x && x < "2007/09"){...} と書く。月日は省略されると1、時間以下は0となる。(普通) しかし、そう書く理由はソースが短くなるからじゃない。 if("2007/08/01 00:00:00" <= x && x < "2007/09/01 00:00:00"){...} と書いても良い。 59:59だとか、9999だとかは、まずいサインだと思っている。 型を強く意識している場合は多いからだ、 上記の場合、この型がミリ秒まで保持することになったとき、 23:59:59は正確な最後ではなく、23:59:59.999と書く必要があり 僅かだが穴のあるプログラムとなる。 データ的にはピコ秒まで持てるようになったら?.999999... 精度の問題じゃない、結局は 「2007/09/01に限りなく近い値」となる なら2007/09/01 00:00:00と比較すれば良い。 ソートで単に最後にしたいものに 9999 を入れるとか、 場合によってはハードコーディングとか、もう見てられない。 必要以上に型の精度に依存しないで欲しい。
- 365 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:33:50 ]
- ミリ秒以前にうるう秒
- 366 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:36:45 ]
- <= じゃなくて < を使えば済む話じゃないのか
- 367 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:48:33 ]
- >>366
そう、そういう話。 でも使ってる精度が日まで(時以降が00:00)で、Webフォームから期間を入れられた場合、 開始日〜終了日という入力欄では終了日も含むので、 x < 終了日+1 とせず、単に x <= 終了日とする奴が中々多い。 右の方がシンプルだし、わからんでもないが。 それで登録日時(時分秒が有る)とかを検索する処理でも同じソース使って馬鹿がって結果になってた。
- 368 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:52:32 ]
- >>363
文字とバイトがごっちゃというのは俺に言っているのか? 俺は、CとC++が文字とバイトをごっちゃに扱っていると言ったつもりだ。 だから俺にそんなこと言われても、お門違い。
|

|