- 1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:06:26 ]
- malloc(sizeof(char)*(strlen(s)+1))
ではなく malloc(strlen(s)+1) と書くような糞コードばかり見て育った、 悪しき慣習を引きずった人は引退すべし
- 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++が文字とバイトをごっちゃに扱っていると言ったつもりだ。 だから俺にそんなこと言われても、お門違い。
- 369 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 01:04:36 ]
- wchar.hなど有るし、文字とバイトをごっちゃに扱ってるようには思えないが・・・
それにchar==文字でなく、char*==nul終端文字ストリームというのがあったから SJISなどをそれなりに扱えて来たわけだし。
- 370 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 01:20:30 ]
- ちなみに、java,C#などは文字型が本当の意味で独立してるわけじゃなく、
単に内部のエンコードを割り切ってUTF-16に統一してるだけ。 昔、C言語がasciiで十分と考えたように。 その利便性はもちろん大きいけど、その代償としてUTF-8などを読み書きするとき エンコード変換のオーバーヘッドを受け入れている。 ※よほど巨大なファイルでない限り対したオーバーヘッドじゃないけど。
- 371 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 01:27:26 ]
- UTF-16もサロゲートペアを考えるとchar==1文字とならない。
Unicode領域で固定バイトが出来るのはUTF-32だけ。 でもascii1文字に4byteも使うことと、 サロゲートペアの文字があまり重要でないことからUTF-32で扱っているシステムは少ない。 未来の言語のcharは32bitかもしれない。
- 372 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 02:46:39 ]
- おれは>>355と同じように考える。
>>357,>>361で抽象化とか総称化とかって話がでてるけど、 そのようなケースになったときは、そう書けばいい。 しかし、このスレでは‘sizeof(char)’は抽象化されてない。 あくまで、>>1の記述に的を絞って考えたらやっぱり冗長かなーと。。。
- 373 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 02:49:51 ]
- >>354
> char* strmalloc(int len){return len<0?NULL:malloc((len+1)*sizeof(char ));} len=0のときにNULLにしてしまうのは、ちょっと馴染みがないんだが。
- 374 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 02:53:44 ]
- え?
- 375 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 02:55:50 ]
- >>354
その引数lenの型は、size_tにして、条件演算子は排除。
- 376 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 02:58:23 ]
- >>373
len<0が0を含むっていうのは、ちょっと馴染みがないんだが。
- 377 名前:373 mailto:sage [2007/09/04(火) 03:40:49 ]
- ごめん、寝ぼけてた。
真と偽を逆に見てた。
- 378 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 07:21:37 ]
- >>375
あ、確かに、size_tだな。size_tってunsignedって保証あるんだったっけ? \0を入れられない、len==-1(len+1が0に)でNULL以外が帰ると都合が悪いので負の数を弾いてた。
- 379 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 07:48:25 ]
- >>369
例えばmemsetなどのmem〜関数がごっちゃにしている例。 wchar_tはいいが、後付なのでここでは省きたい。 Shift_JISなどはマルチバイト文字なのだから、 char1つで表せないのは当たり前のことだ。 >>370 charが単に16ビット符号無し整数型とは別に存在するだろ。 Javaにはそんな整数型は無いが、いずれにせよcharが 整数として演算可能な型ではないことを言いたかっただけ。 >>371 D言語はUTF-32も扱える
- 380 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 09:19:06 ]
- >>379
「D言語は」って・・・Cだと扱えないのか?
- 381 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 11:33:12 ]
- >>379
そりゃmem*でも文字列は扱えるけど、普通は str* wcs* を使うだろう。 文字列にmem*使う奴が悪いと思うが。 >wchar_tはいいが、後付なのでここでは省きたい。 Cの規格自体、かなり昔から何度も改訂されてるし、 今ではwchar_tも正式な仕様なのに、後付け扱いはあんまりかと・・・。 まぁCではtypedefなんで後付け感は確かにあるけど。 > charが単に16ビット符号無し整数型とは別に存在するだろ。 > Javaにはそんな整数型は無いが、 > 整数として演算可能な型ではないことを言いたかっただけ。 javaのcharは16ビット符号無し整数で、整数として演算可能だよ。 > D言語はUTF-32も プログラミングで言えばlinuxのgccのwchar_tも32bitだっだはず。 俺が言いたかったのはUTF-32を内部コードとして使ってるOS,ライブラリ,ソフトウェアが少ないってこと。 >>380 UTF-32用の組み込み型があるって意味だと思う、 (Dはそもそも強いtypedefがあるから、組み込みでなくても問題ないけど) 「標準」っていうことが重要になる。 標準でないと、各々作ってしまう。 typedef unsigned longならまだいいけど、 構造体やクラス化されると他ライブラリとの互換性がね・・・。
- 382 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 16:19:11 ]
- >>378
size_tは普通 signed な何かです。
- 383 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 16:37:46 ]
- いいえ、unsigned intかunsigned longであることのほうが普通です。
- 384 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 17:09:44 ]
- ssize_tと間違えていたよ
- 385 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:43:25 ]
- >>371
D言語はUnicodeを知っていて、UTF-8,-16,-32の変換は勝手にやってくれるらしいぜ。 import std.stdio; void main() { string s = "AΑあ"; // UTF-8の配列 writefln(s.length); // 当然長さは、6 foreach(i, dchar c; s) // UTF-32で取り出す writefln(i); // 0, 1, 3 ... 自動でUnicodeスカラ値単位に区切ってくれる! }
- 386 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:51:22 ]
- > // 当然長さは、6
当然? 素直に考えれば、長さは3だと思うけど。
- 387 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:54:37 ]
- string は const(char)[] のaliasだから、ただのUTF-8シーケンスなのです。
だから、長さは6なのです。
- 388 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:59:16 ]
- Dはちょっと見ないあいだにますます変な機能が追加されてんだな
const(char)[] って何だよw
- 389 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 07:48:16 ]
- D言語って、そんなに悪くないと思うよ。
同じことをC++でベタベタとコードを書いたり、 可読性の酷くわるいマクロや、テンプレートを駆使しすぎるよりは。
- 390 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:55:15 ]
- 385はうそっぱちなので真に受けないでください
- 391 名前:デフォルトの名無しさん [2007/09/06(木) 23:49:44 ]
- デーげんごっていつのまにかたいへんなことになってんだな
- 392 名前:デフォルトの名無しさん [2007/09/14(金) 20:35:08 ]
- さすがに、みんな飽きたな。
次のネタを検討しようか。 引数を1つしか取らないようなprintfを書くな。 そういうコード例の参考書は買ってはいけない。 ってのはどうよ。 Cの標準化の人達は、なんで、print を用意しなかったのかな。 putsとカブっているとはいえ、引数1つのprintfが氾濫するよりはマシだろうに。
- 393 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:13:54 ]
- puts は最後に改行文字を出すぞ
- 394 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:18:32 ]
- 文盲?
- 395 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:24:10 ]
- コンパイラが最適化するからどうでもいいんじゃないの?
- 396 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:37:40 ]
- >>393
よくあるprintfの酷い使い方。 printf("==== ほげほげ version 1.0 ======\n") ; printf("Programed by foobar\n") ; 一行ずつ別々にprintfを呼ぶなら、putsでもいいんじゃないか。
- 397 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:39:13 ]
- >>395
そんな変な最適化をするコンパイラなんて捨ててしまえ。 そういうのに慣れていると、 printf("私のコードは100%safeです。\n") ; なんていう恐ろしいことをやる馬鹿が出てくるんだよ。
- 398 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:42:51 ]
- puts, gets, putchar, getchar, printf, scanfまるごとなくしてしまえ。
f版でいいよ。 gets, putsとfgets, fputsは微妙に挙動が違うのが癪だが。
- 399 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 22:09:27 ]
- 少なくともgccはフォーマット文の中身まで見て最適化するよ
- 400 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 22:35:27 ]
- gccが最適化するからprintfを変な使い方をしてもいい、というのは間違いだと思う。
すでに書かれてしまった膨大なコードのために、変態な最適化をしてくれるのだと思う。
- 401 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 22:37:51 ]
-
void OutputMessage(char* s) { printf(s) ; } こんな関数があったとしたら、 OutputMessage("100%safe") ; なんて呼び出す輩が出てくる。 gccがprintfの引数を見て最適化してくれればバグが顕在化しないが、 最適化しない環境に持っていけばバグが顕在化してしまう。
- 402 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 22:38:28 ]
- >>397
俺的には-Wallで警告出るから問題ない
- 403 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 22:43:11 ]
- >>402のようなのは警告でないっしょ?
- 404 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 00:03:52 ]
- でるよ。
- 405 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 00:54:17 ]
- >>401
俺は何でもかんでもprintf使う方だけど、コレは無いなぁ・・・。 void OutputMessage(char* s) { printf("%s",s); } puts、fputsなんてここ5年ぐらい使ってない。 対話なCUI作るときは(滅多に作らないけど)cursesなことが多いし、 ログ出力は定型で吐くラッパ作ることが多いし、 出力部分をgrepするのに、いちいち正規表現やなんかで色々指定するのダルい。
- 406 名前:401 mailto:sage [2007/09/15(土) 01:53:37 ]
- >>405
そのまさかをやる人間が少なくないのですよ。 printfに渡す文字列に対してサニタイジングを行うべし なんて真顔で言う人間までいる。
- 407 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 02:09:08 ]
- あたしゃprintf("<>")なんてのはやるがね。
- 408 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:14:37 ]
- >>400
一般論だが、 想定外の変なデータにあわせてプログラムを書き換えるというのは たいていあとでほころびが出たりしますよな。
- 409 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 00:01:27 ]
- ん? printf("\n") ; がだめってことか?
何で悪いのか判らん・・・
- 410 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 00:59:50 ]
- 別にいいと思うよ。
- 411 名前:デフォルトの名無しさん [2007/09/18(火) 01:10:15 ]
- かつては、printfをどこかで使ってるなら出力は全部printfにしたほうが、
さらにもう一つputs関数がリンクされてしまうよりも 実行ファイルが小さくなるという効能があったのではないかと思う。
- 412 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 01:37:58 ]
- >>1
死ね
- 413 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 01:42:07 ]
- そもそもputsとfputsの挙動が違うのがな
今日の言語設計者は気持ち悪くて、そんなことできないと思う。
- 414 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 03:22:46 ]
- しょうがない。
もとはと言えば64KB程度のメモリで動いていたマシンのOSと、OSの上で動くプログラムを書くとき、 メモリを節約するために共通コードを関数としてライブラリ化したような代物だから。
- 415 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 23:17:00 ]
- ところで、sizeof(char)=sizeof(short)=sizeof(int)=2っていう設定のトンデモコンパイラがあるらしい。
一応、C言語の規格上これは間違っていない。(型のサイズは決められてないからね。)
- 416 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 23:39:37 ]
- kwsk
- 417 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 23:49:13 ]
- sizeof(char)=2は規格上まずいだろ
- 418 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 00:00:53 ]
- >>415
>>206
- 419 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:43:58 ]
- もちろん、Cでもsizeof(char)は1だと明確に定められてるから。よろしく。
- 420 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 15:02:18 ]
- >>415
「だから sizeof(char) は省略すべきではない」という主張?...でもなさそうだな。 このスレタイは「必ず1でも」って条件付きだから関係ないよね。
- 421 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 15:50:12 ]
- 無次元の1と1バイトって同一視して話していいんだっけ。
|

|