- 1 名前:デフォルトの名無しさん [2007/04/01(日) 23:01:13 ]
- エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。 ※sageは禁止です。 【前スレ】 【初心者歓迎】C/C++室 Ver.35【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1171888583/l50 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 511 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 17:12:28 ]
- CからC++ではなく、OO系言語からC++なら
std::stringとかメンバにする人もちらほらいるかと。
- 512 名前:498 mailto:sage [2007/04/21(土) 17:38:07 ]
- >>509
それは理解していますが、可読性という意味ではNULLの方が上かな、 と思いまして。というのも、私が一瞬理解できなかったからです。 未熟と言われればそれまでですが。 >>502 そうか… fがstdinとは限らないからですね。
- 513 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 18:44:18 ]
- >>511
レガシーC使いでもちゃんと勉強している人は構造体をmemset()する愚は理解しているものだが。 実際漏れの勤める会社でも構造体をmemset()する癖のある香具師がど填まりしていたよ。 #std::stringじゃなくてCStringってところがあれだけど。 で、当人曰く、「memset()できないなら危なくて使えないな」という間抜けっぷり。
- 514 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:01:39 ]
- = { 0 }; で初期化すればゼロクリアになるけど、
コンパイラによっては警告が出て鬱陶しいんだよな。
- 515 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:10:20 ]
- そこでboost::value_initializedですよ
- 516 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:13:05 ]
- >>513
なんでダメなんだっけ?
- 517 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:23:14 ]
- >>516
多分、内部でSysAllocStringを呼んでるのでわ? CStringを0でセットすると取得した領域がゾンビになるのでわ?
- 518 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:28:06 ]
- >>517
すまん。構造体の方。 いっつもゼロ埋めしてるんだけど、これがまずいなら オレは今から全裸でコンビニに行かねばならん。
- 519 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:31:52 ]
- >>518
する理由は? 百害あって一利なしなのだが。 #これから食事なので、百害の詳細については後程。
- 520 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:43:22 ]
- そら言い過ぎ
- 521 名前:518 mailto:sage [2007/04/21(土) 19:44:43 ]
- >>519
自分で構造体を使うとき、誕生時に全ての要素がゼロであるような 使い方というか設計をしてるから。 他人のライブラリのときは、どうでもいいけど保険でゼロ梅してる。 とりあえず、もう服は全部畳んだ。
- 522 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:51:47 ]
- WinAPI に渡す専用の構造体とかは、memset で 0 クリアすることが多いな
ZeroMemory だけど
- 523 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 20:03:31 ]
- 初期化構文使って
struct Foo foo = { 0 }; で済ますほうが簡潔な上に、ポインタや浮動小数点数等もよろしくやってくれるな。 まーPODを単にビット的にゼロフィルすれば良いと分かっているケースでは memset()/bzero()/ZeroMemory()の類でもいいんでないの。
- 524 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 20:03:45 ]
- >>516
非PODでは、仮想関数テーブルなどソースコード上にないメンバが存在する可能性がある。 また、浮動小数点数の0やヌルポインタがビットパターン0の並びであることは保障されていないので、 PODでもmemsetでの0クリアはするな(初期化子でならOK)といわれる所以。
- 525 名前:518 mailto:sage [2007/04/21(土) 20:06:10 ]
- >>524
>浮動小数点数の0やヌルポインタがビットパターン0の並びであることは保障されていない あ、そうだった! なるほど・・・うかつであった。 以後気をつけます。 ではこのままコンビニに行ってきます。
- 526 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 20:35:57 ]
- >>522
つーかWinにおけるMS定義の構造体はMS自身がサンプルコードやらでZeroMemoryしてるしなぁ まぁ、他環境への移植性を考慮するなら安易なmemsetはヤメテオケってことかと
- 527 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 21:04:08 ]
- 他の部分でバリバリ環境依存なコードを書いてる状態なら、
構造体の部分だけ移植性気にしてもしゃーないわな。
- 528 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 21:04:42 ]
- MSつーかVisualStudioでも、Debugビルドで折角ローカルなオブジェクトは異常値を埋めてくれているのに
それをわざわざ無にしてバグの発見を遅らせることになりかねないね。
- 529 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 21:09:14 ]
- >>528
VisualStudioの動作する環境で0クリが問題になるのか? vtbl壊してたらどっちみち動かないだろ?ん?
- 530 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 21:38:13 ]
- コンビニから帰ってきました。 今日はなんかスースーしてて寒いね。
いまさら環境依存とかいっても、実際ヌルポインタが0じゃない環境って 冷静に考えたらまず無いよね。浮動小数点も。 ま、そーゆーアーキテクチャが現存してるなら、それに携わるときだけ 気をつければいっか。
- 531 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 21:42:59 ]
- スースーしてて寒いのか
こっちゃ蒸し暑いぜ
- 532 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 22:45:07 ]
- 俺は金○を広げながら書いてます。
>>528 意味分からない。
- 533 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 22:47:00 ]
- 別に 0 クリアは、異常値を無にしてるんじゃなくて
必要な値として 0 を入れてるんだろ?
- 534 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 22:59:21 ]
- >>533
それが本来あるべき姿なのだが、 現実には>>513のようにとりあえず常に0クリアするという奴が後を絶たない。
- 535 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 23:21:47 ]
- 宣言時に入る異常値なんて必要無いし
- 536 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 23:36:04 ]
- わざわざクリアされて作られた0値だって必要ない
- 537 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 23:50:55 ]
- 0クリアに頼らずに自前でオブジェクトイニシャライザ用意しとけと言う事か
- 538 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 23:51:41 ]
- つまり構造体にはコンストラクタを設けろと。
- 539 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 23:54:36 ]
- そして資源の漏れを防ぐためにデストラクタも設けろと
でRAII来たこれ
- 540 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 00:08:35 ]
- そうしてクラスが出来上がっていく…
- 541 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 00:09:22 ]
- ぶっちゃけC++にもBeanって言葉を導入してもいいかもなw
- 542 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 01:28:44 ]
- データ構造とアルゴリズムの基本的なことを学ぶのに適した本を教えて下さい
- 543 名前:542 mailto:sage [2007/04/22(日) 01:30:25 ]
- すみません、書き忘れました。C言語です
- 544 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 01:50:42 ]
- >>539
そこまでするならクラスにしろよ、ってな話だな。
- 545 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 03:59:03 ]
- VC++でウィンドウを表示して、その中でFLASHを再生したいのですが
どうすれば実現できるでしょうか
- 546 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 04:00:27 ]
- >>545
IShockwaveFlash
- 547 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 04:07:22 ]
- COM勉強してきます…orz
- 548 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 04:31:42 ]
- >>538
つか、構造体は関数のない方がいいでしょ 使うときは通信とかの場合だし 32バイト単位とかで切ったりするんでしょ >>542 C++じゃなく、C言語かね、理系? 30年前の凄い有名な本あるけど、・・・古い Cアルゴリズム大百科、みたいなのがオススメ 中に、クイックソート、挿入ソート・・・、ニュートン法、ガウス・・・ とか載ってるヤツ
- 549 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 09:33:28 ]
- WIN32の構造体だけはゼロクリアでいいと思うけどな。
MSがそういう使い方を推奨している以上そう使うのがどおり。 基本的にライブラリの実装者のやり方に合わせる。 それ以外ではいろいろ問題ありだから使わないけどね。
- 550 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 09:43:09 ]
- 「道理」(どうり)
「通り」(どおり)
- 551 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 11:14:29 ]
- Win32の構造体は、いつもHOGE hoge = {sizeof hoge};で初期化している
- 552 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 11:33:55 ]
- 漏れは毎回毎回、menset か setmen で悩む
- 553 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 11:46:24 ]
- 構造体の初期化は
HOGE hoge = {0};がデフォ
- 554 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 11:54:00 ]
- >>552
メーン、memはmenじゃないぜ〜
- 555 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 12:11:11 ]
- 要するに、アレだよな。
C言語コーダが Hoge h = { 0 }; 可能かどうかは自分で判断できるし、 作った時点では問題ないよな。 人様が作った構造体や、自作の構造体でもバカの一つ覚えで memsetしちゃうのは問題アリじゃね。WinAPIで指定してる場合はともかく。 >>513 が言うように、個別の初期化は多少の手間は増えるけど 安全だし、それでいいと思うけどなあ。 #C++だって、わざわざ初期化リストを設けてるし(C++ならstructでも使えるよ)
- 556 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 12:13:03 ]
- >>552 setmenって、男にナニをセットするんだ?
気になって気になって今日は良く寝れそうだ。
- 557 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 12:57:38 ]
- setmenは男に何かをセットするんじゃなくて「セットする男達」だろ
常識的に考えて・・・
- 558 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:02:20 ]
- YO! MEN!
いや、setmen は男を何かにセットする関数だろ 常識的に考えて・・・
- 559 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:10:18 ]
- 男の部分を何かにセットするわけか
エロいな
- 560 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:10:38 ]
- >>551
そうしてたけど、最近の VC++ は警告出すから困る。 #pragma で抑制できるけど。 >>552 strcpy, strcat, strchr とか文字列に関するものは str が接頭辞になってる。 同じく、memset, memcpy, memmove とかメモリに関するものは mem が接頭辞になってる。 悩む必要性は無い。
- 561 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:35:11 ]
- 頻繁に使う構造体なら継承してコンストラクタ定義してしまえってじっちゃんが
- 562 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:44:51 ]
- レガシーAPIに渡せないだろ
- 563 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:49:12 ]
- こっちで変数定義したものを向こうへ渡すのなら、
アップキャスト(ポインタ・参照渡し)・スライシング(値渡し)が起こるだけで、 言語規格上問題ないだろ。 向こうでオブジェクトが作成され、自分はそれへのポインタを受け取るという場合に 派生クラスへのポインタで受けたら、言語規格上未定義にはなるだろうけどさ。
- 564 名前:552 mailto:sage [2007/04/22(日) 15:30:50 ]
- >>560
そうなのか、memが初めなのか 脳内では、セット麺、麺セット、麺コピーって変換してた
- 565 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 16:13:33 ]
- >>562
VC++ の CRect は RECT を継承したクラスなんだぜ。 でも、レガシーAPIに渡せるだろ? 仮想関数がないからな。
- 566 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 16:25:18 ]
- >>565
仮装関数は関係ないだろ
- 567 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 16:25:32 ]
- >>565
ちゃうちゃう。 CRectはRECTを継承してない。内部の最初に保持してるだけ。 is-aじゃなくてhas-aの関係 同様の方法でWinAPI32に引き渡せるMFCクラスあるでよ。
- 568 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 16:27:37 ]
- >>567
CRectはRECTを継承しているよ
- 569 名前:567 mailto:sage [2007/04/22(日) 16:29:52 ]
- >>565
ああ、ゴメン俺のまちがいだった。RECTの継承でよかったわ。
- 570 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 17:34:42 ]
- レガシーAPIに渡せるってわざわざ自分で&付けてるのかよwwww
変換演算子あるんだから使えよカスwwwwww
- 571 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:06:24 ]
- ( ´д)ヒソ(´д`)ヒソ(д` )
- 572 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:06:58 ]
- >>566
ああ、そうだ。関係なかった。すまん。
- 573 名前:デフォルトの名無しさん [2007/04/22(日) 18:24:12 ]
- 構造体をmallocしたときは初期化はどうしたらいい?
1.気にせずmemset 2.最近のmallocはゼロクリア保障なのでそれを信じる 3.地味に全部真面目に設定
- 574 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:32:22 ]
- >>573
Cなんだよな。 1.自作の構造体で間違いないのならおk 2.保証されてるかどうかちゃんとCユーザーズマニュアルを見れ 3.一番安全
- 575 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:32:32 ]
- 一方ロシアはcallocを使った
- 576 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:32:57 ]
- > 最近のmallocはゼロクリア保障
大嘘を付くな
- 577 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:41:35 ]
- >>576
え、いや、ウソじゃないです。ごめんなさい。うそじゃないです。
- 578 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:55:40 ]
- >>573
>最近のmallocはゼロクリア保障なのでそれを信じる ってホントなの?どういう環境での話? main() { for(;;) { struct { int i; } *s = malloc(sizeof *s); assert(s->i == 0); } } すぐに死ぬけど
- 579 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 19:05:37 ]
- 0 クリア保証してるのは calloc だろ。
- 580 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 20:38:22 ]
- VC++2005で見た限りはvirtual関数があるとサイズが増えてるね。
#include <stdio.h> struct TEST1 { int x; int y; }; struct TEST2 { int x; int y; void setXY(int x, int y) { this->x = x; this->y = y; }}; struct TEST3 { int x; int y; virtual void setXY(int x, int y) { this->x = x; this->y = y; }}; int main() { printf("%d %d %d\n", sizeof(TEST1), sizeof(TEST2), sizeof(TEST3)); return 0; } 結果 8 8 12
- 581 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 21:05:10 ]
- >580
だから?
|

|