1 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 06:07:36.70 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part93 toro.2ch.net/test/read.cgi/tech/1324922431/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.77【環境依存OK】 toro.2ch.net/test/read.cgi/tech/1323692486/ ■長いソースを貼るときはここへ。■ codepad.org/ ideone.com/
369 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 14:11:58.88 ] ?
370 名前:366,368 mailto:sage [2012/03/19(月) 14:27:55.83 ] >>369 例えば2つの可変長データを含む構造体をバイナリで保存した場合、 それぞれの長さが分からないと、 読み込む時最初の可変長データの次のデータが可変長データの続きなのか、 それとも次の可変長データなのか判断する方法がないと思ったのですがおかしいでしょうか?
371 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 14:36:19.03 ] >>366 なんでバイナリなの? xmlは使えないの? データ構造とファイル設計は混同しちゃダメだよ。
372 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 14:37:39.25 ] vector<構造体> msg; で、必要な数だけpush_backする。 表示する場合は、msg.begin()msg.end()を使えば良いのでは?
373 名前:366 mailto:sage [2012/03/19(月) 15:43:41.33 ] >>371 xmlが使えるといいなと思うのですが、ファイルの中身が見えてしまうもので ゲームというジャンルのために暗号をかけたバイナリデータに拘っていました。 本当はバイナリデータなんて使いたくないのですが…。 >>372 きちんとロードできるか試してみます。 表示はそれでいけると思います。 ありがとうございます。
374 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 17:33:23.80 ] >>373 XMLだって暗号化できるでしょ? データの記述方法とデータ構造とファイル構造をごっちゃにしちゃだめだよ。
375 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 17:52:10.63 ] class R{ shared_ptr<A> a_; public: weak_ptr<A> getA() {return weak_ptr<A>(a_);} 【or】 A *getA() {return a_.get();} }; リソース管理クラスを作りたいのですが外部からAを利用したい場合weak_ptr・生ポ(constでない)どちらで取得するのが良いのでしょうか? ※a_の寿命はR内で管理したいのでshared_ptrは公開したくありません
376 名前:366 mailto:sage [2012/03/19(月) 18:37:22.16 ] >>374 xmlってそんなこともできるのですね知りませんでした、お恥ずかしい限りです。 xmlについて勉強してみます。
377 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 19:34:03.99 ] 大学でC言語習ったけど全くこのスレのレベルについていけない半年ROMるとなんか変わるの?
378 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 19:40:54.84 ] >>375 weakをlockしたらshared_ptr取れちゃわない? 俺も似たような問題で悩んでweak_ptrのようにオブジェクトの生存確認が できるけど所有権は主張しない生ポインタとスマートポインタの中間みたいなやつを 実装しようか迷った末やらなかった
379 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 19:45:52.94 ] >>376 XMLというか、文字列orバイナリについて暗号化かけるだけだから、 別にXMLどうこうじゃないよね 例えば全部の文字についてXORかければ最低でも普通には読めないで高速な暗号化できるわけで。
380 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 20:15:38.57 ] >>378 ありがとうございます。取れちゃいますね、、 weak_ptrのlock()が *get()になるようなバージョンがあるといいんですが。 素直にポインタで公開するのが妥当なのでしょうか?
381 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 20:20:29.26 ] 普通に生ぽでいいんじゃね どうせ呼んでる間は死なないんだろ
382 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 22:06:28.71 ] >>377 さすがに半年ROMったらかわるっしょ
383 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 22:07:30.27 ] >>380 ハンドルを使う方法もあるけど、 実際ポインタで困ることはそんなに無い気がする
384 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 23:53:51.31 ] >>377 とりあえず自分に必要なものを作ってみて、実用しないとニーズの比重がわからないよ。
385 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 13:37:16.64 ] C++では、Cのように関数の引数の型宣言を)と{の間に 書けないとのことですが、引数が多い場合は、()の中に 改行して書けということでしょうか?
386 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 14:00:00.62 ] そうだよ
387 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 14:54:19.71 ] 今時そんな構文使えるCコンパイラあるんけ?
388 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 15:09:18.14 ] Ruby開発者がなぜかこれにしがみついてたなあ
389 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 15:18:26.47 ] むしろ使えないCコンパイラがどんだけあるんだよって話
390 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 15:20:35.12 ] CならC99専用でもない限り使えると思うぜ まあ極めて問題のある構文だから使わない方がいいが #include <stdio.h> int foo(a, b) int a, b; { return a + b; } int main() { printf("%d\n", foo(1.2, 2)); return 0; } 実行結果: 1931896422
391 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:20:35.89 ] Code Pad上ならエラーになるな まぁGCCの問題だけど codepad.org/ceAMmTJC いま動くコンパイラって何が有るの? 16bit時代のコンパイラ?
392 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:23:00.68 ] >>385 int Function ( int arg1, int arg2, int arg3, ) { return 0; } 初めて見たときは寒気が走ったがこういう書き方するところも有る。
393 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:26:01.05 ] 全角スペースでエラーになるのがgccの問題とか言っちゃう男の人って・・・
394 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:41:08.16 ] >>391 あいたたたたた
395 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:46:28.00 ] >>392 最後のコンマは書けないぞ 俺はこうか int Function( int arg1, int arg2, int arg3 ) { return 0; } こうだな int Function( int arg1, int arg2, int arg3) { return 0; } エディタとの相性に合わせて使う
396 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:47:47.41 ] メンゴメンゴやっぱうごいたわ codepad.org/3TQKnfBZ
397 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:49:06.61 ] >>395 カッコの揃える派とカッコどうでもいい派に好みは別れるよね
398 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:56:42.52 ] 既存にあわせちゃう
399 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:59:09.59 ] >>396 この書き方だと型チェックが行われないので 1.2 が double 値のままスタックに積まれて、 それを int 値として取り出した結果、無茶苦茶なことになっている 簡単に未定義動作が起きる極めて危険なものなので 今時決して使ってはいけない
400 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 17:05:06.31 ] >>390 C99でも廃止予定事項なだけで使えるぞ。
401 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 19:49:26.83 ] 385です。先輩方いろいろ教えて下さり有難うございます。 括弧の中に書くのはやっぱり慣れてないというのもあって、 不細工な気がしますね。諦めてpascalに行こうかしら。
402 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 23:10:23.09 ] その方がいいと思う。 そんな危ない書き方を慣れてないという理由だけで継続するとかとんでもない話だし。
403 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 08:42:18.70 ] >>399 これでOK。 codepad.org/oyP2YgaY 型を省略したらint型ってことだけど、危なくてしゃぁないな。
404 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 11:07:25.08 ] 以前このスレッドでラムダ関数(ラムダ式)の再帰が出来ると聞いたのですけど。 具体的にはどのようにやるのですか? 例: ある型 f; f=[ & f ](int a){if(a==0)return; else f(a-1 )}; ってかんじですか?
405 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 11:47:34.68 ] ttp://ideone.com/Vdw5h
406 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 11:50:18.46 ] >>405 ありがとうございます。 autoとfunctionの違いは教えてくれませんよね?
407 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 11:55:23.10 ] >>406 ググれ
408 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 23:46:09.58 ] メモリ断片化対策としてメモリプールを使ったメモリ確保を実装したいのですが STLや標準ライブラリなどはいちいち自前のアロケータを指定する方法しかないんでしょうか?
409 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 23:49:18.96 ] それ以外のどんな方法がほしいんだ?
410 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 23:49:43.38 ] >>408 プールの実装に確保サイズ以外の情報を使わないのであれば ::operator new () を 置き換えるという方法もあるよ。
411 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 00:01:40.50 ] >>410 new/delete演算子をグローバルなオーバーロードをすれば STLや標準ライブラリからも呼ばれるということでしょうか?
412 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 00:12:39.92 ] >>411 そういうこと。少なくともアロケータ引数を取るテンプレートはデフォルトで std::allocator を 使うことになってて、デフォルトの std::allocator 実装は ::operator new を使うことになってる。 この場合の ::operator new/delete の定義はオーバーロードじゃないけどね。 あとSTLも標準ライブラリの一部な。
413 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 00:20:42.01 ] >>412 ありがとうございます。 やってみます。
414 名前:デフォルトの名無しさん mailto:sage [2012/03/23(金) 01:16:08.89 ] newを自作関数に置き換える手法も容易して欲しいよな。
415 名前:デフォルトの名無しさん mailto:sage [2012/03/23(金) 03:36:11.12 ] >>414 それが >>410-413 じゃないのか?
416 名前:デフォルトの名無しさん mailto:sage [2012/03/23(金) 08:52:23.54 ] >>414 何言ってんだかわかんねーな
417 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 01:09:01.95 ] operator new で乗っ取れるんだが、ヘッダにインラインで書けないんだよ
418 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 01:34:29.07 ] >>417 グローバルに置き換えるんじゃ何か都合が悪いのか? 都合が悪い、指定した対象だけに絞りたいとすれば、それは アロケータでの指定を行うのが妥当ということにはならないのか?
419 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:34:30.02 ] 高速化のために自作newをインライン展開したいんだけどね。 できる処理系と出来ない処理系がある。
420 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:38:11.15 ] クラス内に new 置けばできるでしょ。
421 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 01:48:53.74 ] きょ、局所的・・・。なんでもないよ。
422 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 09:32:26.41 ] 相談室ということで何やらぼんやりとした質問ですが virtualとはつまるところ、こいつを継承した何かがあるかもしれないから継承先があるかどうかチェックしてね、という目印のようなものでしょうか
423 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 10:18:58.88 ] >>422 仮想関数、純仮想関数、ポリモーフィズムとかについて調べた?
424 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 16:00:04.90 ] 答える必要があるのかしら?
425 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 16:06:27.51 ] 答えなくてもいいが答えてくれるとは思うな的な
426 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 16:08:31.14 ] エリートでらっしゃったのね
427 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 17:45:48.25 ] 相談室に居ながら答えを出し渋る書き込みをする事に何の意味があるのだろうか 教えないつもりなら素直にスルーしとこうぜ せっかくこういうスレがあってもわざわざ妨害してたら何にもならんし
428 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 18:56:37.91 ] セイラさんは黙っててくださいよ!
429 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 19:12:33.48 ] >>422 基底クラスのポインタや参照を使ってメンバ関数を呼んでも 本来のクラスのメンバ関数が呼ばれるというもの
430 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 21:51:38.93 ] >>422 virtualの有無で、コンパイル結果をアセンブラレベルで比較したことがある。 明らかに違うんだよね。当たり前だが。 で、ポリモーフィズムの仕組みを妙に納得したり。
431 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 21:52:36.51 ] Smalltalk環境として動作してくれるC++のライブラリってないですかね。 別に、Smalltalkのワールドみたいなウィンドウ表示とかは要らないんで、 Smalltalkのイメージファイルを読み込んで、メソッドを記述した文字列を 送ってやると値を返したり、何らかの振る舞いをするってものでいいんですが。
432 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 22:33:58.48 ] テンプレートメタプログラミングが関数型に近い動作というのを聞いたこと有るよ。俺、関数型知らないけど。 プリミティブから作るかBoostにもあったような気がする。
433 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 22:48:08.42 ] 日本語で書いてくれ
434 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 23:51:36.82 ] テンプレートメタプログラミングが関数型に近いって!フフフッ でもね、関数型知らないんだ♪ プリミティブかBoostでいい感じ〜☆ わかんないけど、とりあえずオッケー☆ウフフ☆ タコヤキ!
435 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 23:59:41.95 ] >プリミティブから作るかBoostにもあったような気がする。 ここが何言いたいのかさっぱり解らん 前の文とつながってない
436 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 00:57:09.00 ] えーっと、プリミティブって書いたのはifとかforとかから構築が必要ってこった。タコヤキ! ・・・どこからタコヤキ出てきたんだろう。 さいきんのわかいもんは!・・・なんでもないよ。
437 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 07:20:55.86 ] Objective-C++でいいんじゃね
438 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 09:39:55.77 ] class Base { virtual Base* Duplicate() const { return new Base(*this); } }; class Derived : public Base { virtual Derived* Duplicate() const { return new Derived(*this); } }; という複製処理を仮想関数として作成する場合、 Derived::Duplicate()の戻り値がDerived*でよいのは仕様として決まっていますか? Visual Studioではちゃんと仮想関数として動くのですが。 それとも、どちらもBase*としておくべきですか?
439 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 10:24:50.56 ] >>438 共変の返却値。仕様で認められてるのでDerived*でいい。
440 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 10:43:26.27 ] >>439 ありがとうございます。そういう専門用語があったのですね。 「共変の返却値」でググったら、全く同じような質問が出てきました。 失礼しました。
441 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 16:55:43.84 ] 共変と反変、どっちがどっちか未だに調べないと思い出せない。
442 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 18:06:22.51 ] 技術用語って時々、英語のまま考えたほうが理解できることがある。
443 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 18:42:38.31 ] せっかく母国語化しても漢字に含まれる情報が誤誘導するのって ソース中の無駄に多いコメントみたいなモンだな
444 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 20:00:18.82 ] 字面で見ると漢字の方がわかりやすい
445 名前:431 mailto:sage [2012/03/29(木) 20:02:26.55 ] Panda SmalltalkというScript Engineで解決できそうです。有難うございました。
446 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/30(金) 22:14:39.78 ] 右辺値参照について教えて下さい。 VC2010 で、 struct Hoge { Hoge(Hoge&& rhs) { *this = rhs; // 1 } Hoge& operator=(const Hoge& rhs); // 2 Hoge& operator=(Hoge&& rhs); //3 } 1 の箇所で、3 が呼ばれるかと思ったら、2 が呼ばれてしまいました。 これは、規格通りの動作なのでしょうか? もしそうなら、右辺値参照の operator= にもっていくには、 コンストラクタの引数に対して std::move() すればいいのだと思うのですが、 どうして引数の型が && なのに、再度 std::move しなければいけないのか 理由を知っていれば教えて下さい。
447 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/30(金) 22:27:00.73 ] >>446 右辺値参照は普通の参照も受け取れちゃうから。 完全に転送したいならstd::forwardでも使いな。
448 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 00:06:50.58 ] >>446 Hoge(Hoge&& rhs) { //ここでrhsという名前をつけているからこれは既に右辺値ではなく左辺値になる。 *this = rhs; // 1 //ここでrhsを使おうとする場合があるかもしれない }
449 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/03/31(土) 10:08:25.95 ] www5b.biglobe.ne.jp/~suugaku/vc++kougi/kiso/dai7koudai2wa.html このページの通りにやったのですがデバックして実行ボタンを押すとフリーズしてしまいます まだ初めて日が浅いのでどうかおしえてください
450 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 10:12:23.55 ] それはC++じゃありません toro.2ch.net/test/read.cgi/tech/1268613679/ こっちで聞いてね それにしても初心者がC++/CLIなんて自殺行為だぞ
451 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 10:31:16.28 ] >>450 ありがとうござます それなら別にフォームアプリケーションを作る方法があるのですか?
452 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 10:38:15.05 ] >>451 C#を使うのが普通 今からでも遅くないからC#勉強しなさい >>450 のスレ流し読みしてそれでも使いたいっていうんなら止めないが…
453 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/03/31(土) 10:42:10.29 ] >>452 自分は工業高校生で一年間C++でコンソールを作ってきたのでフォームアプリに挑戦したいと思って最近やってみたのですが C#のほうがいいとは知りませんでした ありがとうございます
454 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 11:04:53.79 ] C++/CLIとか、業務で使わざるを得ないんでもなけりゃ見たくもないわ……
455 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 12:33:34.41 ] C++/CLIを使う意味はないな。 C#を勉強した方が早い。
456 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 13:28:04.74 ] >>453 C++でGUIやりたいならQt調べろ。C#より楽だぞ。
457 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 16:46:46.56 ] /*-----Class.hの中身-----*/ class hoge{ private: bool x; public: void set(); }; /*-----Class.cppの中身-----*/ #include"Class.h" void hoge::set(){ turn=1; } とすると実行時にturn=1ができません。 理由が分からないので教えてください。
458 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 18:10:47.73 ] >>457 turnはどこで宣言されてるの?
459 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 18:48:41.50 ] >>468 すいません bool x; が bool turn; です 間違えました
460 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 19:00:24.75 ] >実行時にturn=1ができません。 何がどうなるのか具体的に書きましょう bool型の値はtrueかfalseだけど、警告をエラーにするオプションつけてたりする?
461 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 19:13:03.86 ] >>460 エラーも警告も出ないのですが、ここの動作にとりかかると実行が中断します。 なので、turnの宣言ができてない又はturnを参照できないのだと思うのですが…
462 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 20:01:12.03 ] turnがboolなら、trueかfalse代入するば良かろうに。
463 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 20:06:28.41 ] >>462 変数がbool型云々ではなく、intなどでも同じように問題が起こってるので 変数宣言自体に問題があるかと思います…
464 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 21:58:21.48 ] hoge* h; h->set(); とかやってんじゃねーの
465 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 22:02:58.68 ] >>464 問題はそれでした 普通にインスタンス化したら解決しましたありがとうございます
466 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 23:12:56.30 ] どうでもいいがC++で実体化(インスタンス化)というと テンプレートの実体化を指す。オブジェクトをインスタンスとは言わない。
467 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 12:13:20.48 ] マジか?
468 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 12:19:06.84 ] >>466 んなこたーない。普通に文脈による。
469 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 16:16:40.29 ] ロケール依存の大文字→小文字変換しようと思ってstd::ctypeみてたんだが、 tolowerって大文字/小文字のサイズが同じ前提で設計されてるように見えるんだが、 そうでない場合を考慮しておきたいときってどう書くのが妥当なんだ? 例:locale=tr_TR.UTF-8の時、大文字'I'(0x49)→小文字(0xc4 0xb1)
470 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 16:53:26.18 ] インスタンスなんて templateかCOMぐらいでしかいわんだろ C++は実体が見えてる場合が多い上、 実体の共有もあんまりしないからな
471 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 17:06:38.85 ] 俺の周りだとクラスのインスタンスとかは言う それを作ることをインスタンス化とは言わない テンプレートに関してはインスタンス化と言うこともある
472 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 17:10:34.28 ] メモリ上に実体化(instantiation)されたオブジェクト等と表現することは普通にあるが… むしろインスタンス化って用語テンプレート以前の時代からあったよね?
473 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 17:15:50.61 ] OOに関係なく実体という意味でのインスタンスって言葉は昔からあった HINSTANCEとかC++すら関係ない範囲だけど
474 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 00:49:13.79 ] ただの一般名詞だよ。特別な意味付けは無い。 eow.alc.co.jp/instance
475 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 01:57:32.24 ] >>469 現行規格の立場だと wchar_t 使えってことになるんじゃないの?
476 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 21:43:49.98 ] 数学の本相談スレで プログラミング板に誘導されたんですけど もしここもスレチだったら誘導お願いします C++、Open GL でユーザーが図形作成できるようなアプリを作りたいです 座標幾何学の勉強をするように言われたんですけど ぶっちゃけ知識がないので 何か勉強するのにいい本を紹介してほしいです
477 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 22:07:22.33 ] googleにベクトルと行列について質問した方が早いぞ
478 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 23:50:42.74 ] >>476 数学の話では線形代数になるけど、そこからだと結構回り道になるから、 3Dゲーム作成に必要な数学、みたいな本を読むのが手っ取り早いんじゃない? タイトル忘れたけど、そんな感じの本を見かけたことあるから しかしC++やOpenGLの使い方とかは大丈夫?全部初めてだと、なかなか敷居高いよ?
479 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 01:29:00.46 ] >>476 >>478 の言うように全部はじめてだと、それなりに時間かかると思うよ。 勉強の順番としては まずは、C++の入門書かなんかやって 次にアプリを動かしたいプラットフォームでアプリを作る方法を学ぶ 次にOpenGLを学ぶ(べつにGLに拘らんでもいいと思うけど)。 それで、アプリの機能に必要な知識を勉強して ようやくアプリが作れる感じ。 がんがれ。
480 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 21:26:00.23 ] 476です、遅くなりました。 授業で簡単な画像を作ったりアニメーションの練習くらいは やったんですけど、数学が苦手なもんで… 一応卒論に関係してくるので、何か参考書とかあればなと思って 書き込みしました。 3Dのゲーム用の数学本を探してみます。 レスありがとです。ももーい。
481 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 21:55:57.25 ] C++で構造体を使うことというのはありますか。 変数も関数も定義できるクラスだけでOkだと思ったのですが
482 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 22:09:51.21 ] >>481 C互換のAPIを使うときなどは使わざるを得ない。 そのほかにも私の場合、レガシーな構造体で充分なときはstructを使う。 要は、メンバ変数を公開するかどうかかな。
483 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 22:37:08.26 ] 構造体でもメンバ関数定義できるでしょ
484 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 22:52:40.05 ] >>482 >>483 勉強になりました。ありがとうございます。
485 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 23:47:09.72 ] >>483 メンバー関数定義したらクラスじゃね? 構造体(POD または データブロック)として使用すると、 仮想関数テーブル破壊するから極めて危険。 ちなみに、俺インターフェース用のクラスとか メンバーが全部publicならstructにしてる。
486 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/06(金) 00:08:34.25 ] 禿が設計ミスしたから class はヌルー、割り切ってすべて struct テンプレートテンプレート引数くらいだね class なんか使うのは private も下痢糞だがしぶしぶ使う 他言語との上っ面だけの横並びなんかウルトラどうでもいい
487 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/06(金) 13:28:43.82 ] 俺はCでコンパイル可能なのはstructでそれ以外はclassにしてる 使い捨てソースは全部structだけど
488 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/06(金) 14:29:09.23 ] 構造体は,《クラスキー》structを付けて定義するクラス。 共用体は,《クラスキー》unionを付けて定義するクラス。
489 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/06(金) 15:53:22.18 ] 用語としてのclassか、C++キーワードとしてのclassか 文脈から読み取らないと混乱するよ
490 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/07(土) 18:29:03.06 ] 簡単な数式を引数でとって結果を返す関数をテンプレートで書こうとしてます。 template<class II, class PD, class CT> int sansuu(II pos, PD n, CT tr) { for (; 0 < n ; --n, ++pos) { ---> ここの書き方 if( tr.eq(*pos, '0') ) { } } return 0; } int main(int argc, char* argv[]) { const char* p = "1+1"; ここの書き方 sansuu(p, strlen(p), char_traits<char>); const wchar* wp = L"1+1"; sansuu(wp, strlen(wp), char_traits<wchar>); インプットイテレータとサイズを引数にして、あとcharとwcharでも 使えるようにしたいんですがどうしたらいいのでしょうか stringを見たらchar_traitsとかあったんですがよくわかりませんでした。 お願いします。
491 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:03:20.38 ] >>490 いいたいことはわかるんだけどまずcharだけでいいから動くもの書ける? forの中身を全部教えろはうんざりだな
492 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/07(土) 19:12:10.50 ] >>491 中身のアルゴリズムの質問ではないんです。書き方が悪くてすいません。 テンプレートの使い方がよくわからないので、そこのところをお願いします。
493 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:17:20.53 ] >>490 どうでもいいが、IIとかPDとか大文字だけの名前使うと プリプロセッサと衝突するぞ
494 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:20:44.17 ] じゃあとりあえず非テンプレートでちゃんと動くwchar_t版書いてみるところからはじめようか
495 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:21:54.66 ] >>492 困ってるポイントがわからんから、まずテンプレートを使わず char固定でコード書いてみてくれないか
496 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/07(土) 19:34:06.85 ] char_traits 使ってるのに strlen というあたり違和感ありあり
497 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:34:16.31 ] >>492 とりあえずテンプレートの使い方ってことで codepad.org/L461ZCtg
498 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:42:13.30 ] >>497 ありがとうございます。 でもこれだと if(*it=='+') のところでwchar_tとcharを比較してしまうとおもってどうにかしたほうが いいと思ったんです。
499 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:55:13.05 ] >>498 char*はascii互換文字コード(ASCII,SJIS(MS932),EUC-JP)で入ってる文字はASCIIコード内だけ wchar_t*はUTF-16 or UTF-32で入ってる文字はASCIIコード内だけ という前提なら一応大丈夫・・・のはず ASCII範囲外の文字も使うならwchar_t*だけで実装して 使う側が文字コード変換する方が良いんじゃね?多分
500 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:58:19.95 ] 追記、ascii互換文字コード(〜, UTF-8)
501 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 20:13:07.49 ] codepad.org/hY36a3Gc そういう中途半端なことするのやめろよ
502 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 20:32:22.44 ] >>501 ありがとうございます。 まだ読みきれてないですが勉強します
503 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/07(土) 20:46:08.50 ] widen
504 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/11(水) 18:55:48.67 ] なんで書き込みないんここ
505 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/11(水) 19:20:38.67 ] お前が書き込まないからだよ
506 名前:デフォルトの名無しさん mailto:sage [2012/04/11(水) 23:20:34.47 ] C++のことが好きになってしまいました
507 名前:デフォルトの名無しさん mailto:sage [2012/04/11(水) 23:21:52.18 ] >>506 まずはお友達から。
508 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 00:55:07.85 ] >>506 まずはCから
509 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 19:15:56.87 ] time.h以外に興味ありません
510 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 21:27:42.52 ] int* p = new(0) int; pが0になる保証ってありますか?
511 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 22:00:03.12 ] ヌルポに書き込んでる時点で鼻から悪魔 組み込み系とかで0番地にどうしても書き込みたい場合ならpはヌルポになるだろうけど、 普通はその前にアクセス違反で死ぬ
512 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 22:04:16.87 ] と思ったけど g++ だと死なないな int() じゃないからかと思ったけど、 int() でも死なないし、あまつさえ int(1) でも死なない 一体どう言う事だ
513 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 22:21:41.97 ] あ・・・ヌルポだからメモリ確保に失敗したと思って初期化しやがらないのか なら、0 になる事は保証されてるっぽいな
514 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 23:09:03.72 ] >>510 void* をひとつ取る配置用の operator new は引数をそのまま返す。 (18.6.1.3 p2) そして noexcept で宣言されているので、ヌルを返すことはメモリ確保失敗の意味になる。 その場合、初期化は行われず new 式の結果がヌルになるとされている。 (5.3.4 p13) というわけで、その p は必ず 0 と等しくなる。 ・・・ void* より優先される operator new のオーバーロードが宣言されてなければね。
515 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 23:57:16.16 ] >>510 どんな 性癖の人が使うの?
516 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 01:05:37.41 ] >>514 うぉぉ、わかりやすい説明だぜぇぇぇぇぇ。 プレースメントnewは殆ど使わないから すぐ挙動を忘れちゃう(´・ω・`)
517 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 02:48:18.14 ] ヌルヌルポか
518 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 12:09:56.25 ] >>511- ガガガガガッ
519 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 15:38:19.28 ] ifstreamとgetlineで外部のファイルを1行ずつ読み込む処理を作りました。 しかしリリースモードで実行すると1行ずつ読み込めません。デバッグモードでは問題なく読み込めました。 原因が分かる人がいたら教えてください。 ちなみにvs2008を使っています。
520 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 16:16:17.36 ] 読み込むテキストファイルは同じやつか?
521 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 16:47:48.38 ] どうせ未初期化の変数の値を使ってるとかの類
522 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 17:13:41.18 ] さもなきゃカレントディレクトリのファイルを読もうとしていて、 DebugとReleaseでカレントが違うことを失念しているとか。
523 名前:519 mailto:sage [2012/04/13(金) 17:27:10.86 ] getlineは通常に動いてました。すみません。 >>521 さんの想像通り未初期化の変数が誤動作の原因でした。 >>520-522 アドバイスありがとうございました。
524 名前:デフォルトの名無しさん [2012/04/14(土) 01:20:20.19 ] 1 0.1 2 0.2 3 0.3 ... みたいにintとdoubleが交互にならんだ入力を、 istream_iterator<int> a(cin); istream_iterator<double> b(cin); で交互に読み取りたいのだが、(テーブルの列読み込み) while (a!=istream_iterator<int>()) { int x = *a++; double y = *b++; } てやっても評価順が制御できなくて困っています。 どうすればいいんでしょうか?
525 名前:524 mailto:sage [2012/04/14(土) 02:00:41.50 ] なんか、上のサンプルを作ろうとしたけどうまくいってしまう。 問題が別のところにある可能性もあるから、ちょっと待ってくれ。
526 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 02:12:54.47 ] うまくいってるならそれでいいんじゃねーの?w
527 名前:524 mailto:sage [2012/04/14(土) 02:32:52.43 ] どうもfor_eachとのからみでおかしい。 C++0xがはいっちゃうけど、流れでここに出させてもらいます。 入力は -1 0.3 -1 0.8 ... みたいな、doubleは適当な乱数。 1/1000くらいの割合で評価順が逆になる。 #include <iostream> #include <algorithm> #include <iterator> using namespace std; int main() { auto b = istream_iterator<double>(cin); for_each(istream_iterator<int>(cin),istream_iterator<int>(),[&b](int n){ if (*b++<0) cout << "fail" << endl; }); } }
528 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:15:36.16 ] 乱数で0とか浮動少数じゃない数値になってんじゃないの 乱数やめて固定値でやtってみたら
529 名前:524 mailto:sage [2012/04/14(土) 03:44:48.16 ] そうね。ちょっと適当にやりすぎたわ。 istream_iteratorがバッファリングでもしてるのかと思ってしまった。
530 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 09:56:55.43 ] >>527 それじゃだめだろ。istream_iteratorの実装によってはインスタンス生成時に値を一回読む。
531 名前:524 mailto:sage [2012/04/14(土) 10:01:34.51 ] >>530 まじかw 1/1000って書いたけど1/10000でもあったから、 調べてみたらたしかに1行目でドジってるw この目的を達成するために仕様に沿った形で書けますか? ちなみに使うときは527みたく for_each(istream_iteratorA,...,istream_iteratorBを使った関数) の格好(入力イテレータで読む)で。
532 名前:524 mailto:sage [2012/04/14(土) 10:09:20.74 ] >>532 つ a=... b=... for_each(...) 別の発想で交互に読み込むことを保証するイテレータの組をつくることはできないか?
533 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 10:46:08.64 ] >531 読み込みが決まり切ってるなら型を起こせばいいんでは? #include <iostream> #include <algorithm> #include <iterator> using namespace std; struct i_and_d { int i; double d; }; istream& operator>>( istream &is, i_and_d &id ) { return is >> id.i >> id.d; } ostream& operator<<( ostream &os, i_and_d &id ) { return os << id.i << "," << id.d << endl; } void testprint( i_and_d x ) { cout << x; } int main() { for_each( istream_iterator<i_and_d>(cin), istream_iterator<i_and_d>(), testprint ); }
534 名前:524 mailto:sage [2012/04/14(土) 10:56:59.48 ] ありがとう。return os << endl;ってできるの知らんかった。 ですが、API上、iとdは別のイテレータにしておかないといけないんです・・・
535 名前:524 mailto:sage [2012/04/14(土) 11:15:24.98 ] いま自分で実装しようとして引っかかったんだけど、 bool operator==(const istream_iterator&, const istream_iterator&) ってどう定義すればいいんだろ・・・
536 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:05:58.99 ] API上別にしないといけないってどういう事? あるタイミングで i を使って、別のタイミングで d を使うって事? 使ったかどうか覚えておけばいいだけのような
537 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:15:17.88 ] >>534 APIって何?WinAPI? 自作エンジン操作するAPIとか?
538 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:26:28.24 ] とりあえず、実際に使う部分を見せて欲しいな 関数名が秘密ならそのあたりは変えていいから
539 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:35:58.11 ] >>535 イテレータ内部でストリームを basic_istream<charT,traits>* in_stream; で保持しておいて return lhs.in_stream == rhs.in_stream; するのがstdでのやりかた
540 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:45:03.82 ] >>524 こんな感じ? ideone.com/n5AKA
541 名前:524 mailto:sage [2012/04/14(土) 14:43:12.69 ] 寝てたんで見るのがおそくなった。すまん。 >>540 が綺麗なんで、APIを変えることにしました。 単体の列をストリームで扱えるようにしたかったんだけど、 行ごとに読み込むストリームのほうがたしかに自然だな。 可変テンプレート引数をとるようにして(my_iter<int,double,double>) tuple<int,double,double>が値になるようにすればテーブル読み込みできるね。 read()を書くのがちと面倒くさそうだが。
542 名前:デフォルトの名無しさん [2012/04/14(土) 18:04:19.59 ] template <typename T, typename U> void f(tuple<T,U>& t) {...} template <typename T, typename U> void f(pair<T,U>& t) { f(tuple<T,U>(t)); } みたいな多重定義を避けられる方法ってないですか? ただし、なんでも受け付けちゃう template <class PairType> void f(PairType& t) {...} ってのは無しで。 (コンパイルでtuple<int,int,int>をつっこんでたらエラーが出るように)
543 名前:541 mailto:sage [2012/04/14(土) 18:15:50.84 ] >>542 template <typename T, typename U, template <typename...> pair_type> void f(pair_type<T,U>& t) {...} かなぁ・・・他にいい案があったら教えて下さい。
544 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 18:35:55.99 ] template<typename T,typename U>struct pair{〜;operator tuple<T,U>&(){return tuple<T,U>(*this);}};
545 名前:541 mailto:sage [2012/04/14(土) 18:42:36.84 ] std::pairの仕様みてもそんなの無いんですが、暗黙の変換をどっかで定義しろってことですか?
546 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 18:52:58.80 ] >>542 template<class T, class U> class tuple { ・・省略・・ tuple( const std::pair< T, U > value ){省略} ・・省略・・ }; もしくは、 template<class T, class U> tuple<T, U> to_tuple( const std::pair &value ) { return tuple< T, U >( value ); }
547 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 19:11:59.04 ] c++0xにstd::tupleというのがあってだな・・・ スレ違いの話題で混乱させてしまってすみませんでした。
548 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 19:27:08.97 ] 脳内でネームスペースを勝手に補完したらダメだよね。
549 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 19:35:16.21 ] m(__)m
550 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 19:50:26.85 ] c++0x ってどんな風に入力したらこうなるんだ?
551 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 20:02:17.12 ] 俺はSTLマスターだが質問あるか?
552 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 20:05:47.40 ] ないわー
553 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 21:18:41.74 ] ないない
554 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 22:30:07.35 ] >>551 std::messagesってどうやってつかうの?
555 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 23:16:35.57 ] std::set<T>のインスタンス同士の一致比較(つまり、同一の集合であることの確認)ってどうやるの? T型の要素はソートされて格納されるそうだから インスタンスをa, bとして、a.begin()〜a.end()までとb.begin()〜b.end()をそれぞれ比較して 全部一致することと同値なのだろうか それとも、STLの仕様的にはそこまでは保証されておらず、上の方法はたまたまうまくいっているか、処理系依存で、 やはり比較前に自前でaやbに格納されている要素をソート等せねばならないのだろうか
556 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 03:03:52.36 ] 結論だけいうと==でやれ
557 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 10:29:58.92 ] > インスタンスをa, bとして、a.begin()〜a.end()までとb.begin()〜b.end()をそれぞれ比較して > 全部一致することと同値なのだろうか 同値でしょ。 要素値を比較する前に双方の要素数を比較した方が良さそうな気がする。 // 要素数チェック if(a.size()!=b.size()) return(1);
558 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:38:51.16 ] mismatchでやれ
559 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 14:56:31.96 ] 比較オブジェクトが同一かも検査したほうがいいんじゃないか?
560 名前:555 mailto:sage [2012/04/15(日) 15:52:01.26 ] レスdクス とりあえず要素となる型に<演算子が定義されていれば (ていうかstd::set<T>のTの用件なのでそもそも定義されている前提) 少なくともVS2010では>556の方法で逝けるみたいです! STLのマニュアルとして↓ここ見ながらやってたんですが、 www.cplusplus.com/reference/stl/ グローバル関数でset<T>& operator==(set<T>&, set<T>&)が定義されるとか どこにも書いてなかったから気づかなかったorz
561 名前:555 mailto:sage [2012/04/15(日) 15:54:45.55 ] 訂正 誤: set<T>& operator==(set<T>&, set<T>&) 正: bool operator==(const set<T>&, const set<T>&)
562 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 16:06:06.28 ] std::setは赤黒木。 赤黒木は同一要素からなる集合に対してはbegin() 〜 end()までの順序構造も同じ。 だから単にsizeを見た後iteratorを回してoperator ==での直接比較か operator <(or operator >)x2で同値比較すればよい。
563 名前:555 mailto:sage [2012/04/15(日) 16:22:00.26 ] スマン>560でボケたことを書いたorz 要素型Tのless than演算子(operator<())だけでは 一致比較できるわけないじゃんorz(多分bool operator==(const T& a, const T& b)が必要) set<int> a, b;についてはa==bで一致判定できましたが Tが自作クラスの場合は要検証です検証中なう
564 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 16:35:32.67 ] 大抵赤黒木で実装されるけど 赤黒木でなければならないと規格で決められているわけでもない
565 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 16:42:12.29 ] >563 !(a<b) && !(b<a) だな。562も書いてるけど。
566 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 16:46:30.43 ] >>565 a,bの間に全順序の存在しか仮定しないときに、 果たしてそのコードでa==bと同値になるのか 冷静に考え直したほうがいいんジャマイカ、
567 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 16:59:04.51 ] いやすまん>565でいいのかorz (!(x<y) && !(x>y)) ⇔ (x≧y && x≦y)⇔ (x == y) 結局、Tについてoperator<()が定義されていれば、 set<T> a, b; についてa==bできるっぽい (実際Tを自作クラスとしても、Tのoperator<()を定義したらVS2010で動いた)
568 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 19:59:18.77 ] std::setのoperator==ではstd::equalが使われstd::equalでは>>555 のように比較される というようなことをごちゃごちゃ書きたくなかったから>>556 みたいにレスしたけど ちゃんと解説したほうがよかったな www.cplusplus.com/reference/stl/set/operators/ ここにも書いてあるぞよく読め
569 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:21:33.47 ] >std::setのoperator==ではstd::equalが使われstd::equalでは>>555 のように比較される なるほど、、いつどのアルゴリズムを使うのかきちんと決まってるのか std::equalの定義(というか規格上の等価テンプレート)みたら、 Tについてstd::equalが使われる場合、Tについてoperator==()は必須みたいですね >567の最後の行は撤回(実はoperator==()が定義されてた)
570 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 00:14:55.06 ] 最近C++を勉強しだしたんだが とりあえず学んだ範囲で簡単な電卓を作ってみたけど なんか自信がないw動くけど 無駄な事してないかとか ツッコミを入れて欲しい codepad.org/uz46AcHY
571 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 02:15:07.23 ] >>570 ・グローバル変数の使用は避ける。 ・calculatorの中で初期化とされてるのは初期化でなく代入。初期化と代入は別物。 ・なぜcalcuratorの中でanswerに代入(初期化)? ・// a:Aの値。 ソースを先頭から読んだ場合この時点ではAの値といわれてもなんなのか不明。 ・// Yと回答されたらループ、それ以外は終了。 実際の処理との不一致。
572 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 06:28:57.57 ] このコードに限らずだが広域でのusing namespaceが個人的にヤダな せめて関数の中でusing namespaceするか、using std::cout;の様に 取り込んどいて欲しい。std系統じゃぶつかりづらいがVectorとか Listとかありふれた名前は簡単にぶつかる。
573 名前:570 mailto:sage [2012/04/16(月) 16:33:06.78 ] ツッコミありがとうございます それをを受けて直してみました codepad.org/T1qZFJTB using namespace std;はまだ私にとって「おまじない」でしかないので std:: を省略できるなら使うか みたいな感じなので・・・
574 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 20:12:09.41 ] 男ならヘッダファイルでusing namespace std;
575 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 20:32:28.10 ] >>574 そんな男気あふれるあなたにC言語
576 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 22:05:18.63 ] >>574 ダメ! ゼッタイ!!
577 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 23:39:54.67 ] >574は漏れもやったが30分で悔い改めた それはそうと、デカいオブジェクトの実体をSTLのコンテナに格納して 複数個所から参照しつつ必要に応じて追加するということをしたいんだけど コンテナにinsert()する前後で参照が有効であり続けるようなうまいやり方ってないですかね… コンテナの要素型を自作クラスでうまく作ればできなくは無いけど標準的なやり方は?
578 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 23:46:58.49 ] std::listを使う
579 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 00:18:51.98 ] using namespace std; がヘッダに書いてあるライブラリを使うことを強制されているんだ! windows.h が自動的にインクルードされていたり、まさに地獄だぜ。 >>577 listを使うか、間接参照するか
580 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 00:24:37.62 ] マクロ展開出力みたいに ADL展開出力オプション欲しいよな
581 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 02:41:59.29 ] >>577 なんでもかんでもshared_ptrでくるんじまいなよ! コンテナ用件は自動的に満たされるぜ!
582 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 05:47:00.52 ] using namespace std; をわざわざincludeするようのヘッダー作ってincludeしまくってるわ とりあえずusing std::stringとかにかえてみた
583 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 06:57:21.79 ] お前の using namespace std; のせいで ライブラリのヘッダでコンパイルエラーが出たわ
584 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 09:46:42.23 ] しかしこのcodepad、まさかの強制using namespace std;である codepad.org/wzgxNgw9 codepad.org/PSECxXqW
585 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 10:06:09.92 ] 全部std::付けたり関数毎に書くのは面倒なので自分の名前空間内でusing namespaceしてる ideone.com/uXfYk ideone.com/IiwPB
586 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 12:38:41.41 ] using namespaceはよほどのことがない限り使わないな。 namespace fs = boost::filesystem; とかはよくやるが。
587 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 13:24:50.23 ] そんなこともできるんだったな すっかり忘れてた
588 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 13:32:52.26 ] using namespaceを使っといて、完成版では置換すればよい。 手間の問題。
589 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 21:48:04.95 ] using namespace したものを置換するのは困難だぞ
590 名前:デフォルトの名無しさん [2012/04/17(火) 22:09:49.45 ] テストコードをそのまま本番に持って行ってるわけね
591 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 22:26:19.01 ] class Sample { const bool aaa(const a, const b) const const int bbb(const c) const const Sample(const d) const } 最近constに触れる機会があったのですが TYPEはintとかfloatとか 【const TYPE】 aaa(const x) const 質問なのですが、【const TYPE】の部分がconstだと 実際にはどういう利点があるのでしょうか 他の部分がconstになっていると 色々とパフォーマンスに影響がありそうだと直感的に理解できるのですが (変数には値とかコピーが入るわけですよね?) 戻り値の型にconstがあったからといって特に意味無いような気がしてしまいまして じゃあ、頭のconstにはどんな意味があるんじゃ!? ということで疑問が湧いてしまったのですが どなたか意味というか意義というか、教えてくださいまし
592 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 22:29:04.87 ] const TYPE&じゃなくてconst TYPEなの?
593 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 22:29:55.14 ] >>581 >なんでもかんでもshared_ptrでくるんじまいなよ! 何を言いたいのかわからんが、 確かに「型Tのset」のかわりに「型Tのshared_ptrのset」にでもして shared_ptr<T>のoperator<()とoperator==()を(適当なスコープで)定義するとしたら逝けそうですな ※ とにかくデカいオブジェクトなので同じものを複数持ちたくない。 当然insert時は重複チェックをやる。これをも極力高速、極力コンテナに任せにしたいからlistというのもちょっと、、、 >577における「コンテナの要素型を自作クラスでうまく作」るのより良さげな回答だけど しかしshared_ptrはSTL標準ではないのではないか
594 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 22:37:54.44 ] >>591 const病の伝染をやり過ごせる利点がある class Sample { int* p; // (適当な構築子) const int* GetPtrA() { return p; } const int* GetPtrB() const { return p; } }; であるとして、 const Sample foo(...); // constオブジェクトとして構成 int* p1 = foo.GetPtrA(); // コンパイル時エラー int* p2 = foo.GetPtrB(); // おk
595 名前:594 mailto:sage [2012/04/17(火) 22:41:43.73 ] ああスマン頭のconstか わからんメリットなど無いのではないか (でもテンプレート絡みでちょっとあるのかも?テンプレートについて人類は何一つ断言できない)
596 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 22:57:13.88 ] 戻り値はconstにする派ってのもいたと思う Effective C++に書いてあるけど、正直やりすぎだと思う
597 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 23:04:48.95 ] レスありがとう …やっぱり、頭が const TYPE の場合はあまり意味なさそうな感じですか? 恐らくコスト面でも無視できるような違いしかないってことですよね。 実際にもあまり使わないという認識でいいのかな そういえば、 const TYPE&の存在がありましたね…。 const TYPE& はパラメーター(参照)のstd::vectorのアイテム参照とかグローバル変数の配列の参照を返す時とかに有効な気がしますが intとかfloatみたいな値を返す時とかに積極的に使う理由ってありますか?
598 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 23:44:43.08 ] 戻り値 const Effective C++ でググれ >・ 戻り値にconstを使うと、問題のある関数の安全性や効率を改善できる > >例2) >const Rational operator* (const Ratioanl& lhs, const Rationa& rhs); > >(a * b) = c のようなコードは不正だが、const 指定すればコンパイル時エラーとなる。 >(a * b) = c; これを展開すると、const Rational (a * b) = Rational c となりエラー。 正直こんなのどうでもいいと思うが
599 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 00:02:43.13 ] 戻り値const派は右辺値参照の登場で窮地に立たされたな
600 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 00:18:49.01 ] 右辺値参照で何か不都合とかあったっけ?
601 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 00:21:29.89 ] 右辺値参照とconst絡みで問題なんてないと思うが 教義を貫けない的な話?
602 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 00:29:13.38 ] 折角右辺値参照を使ってるのに 無駄に複製が発生するようになるからじゃない
603 名前:デフォルトの名無しさん [2012/04/18(水) 00:40:30.17 ] 禿の自刃に殉じた使徒の数知れず (;ω;)
604 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:01:44.61 ] >>598 >・ 戻り値にconstを使うと、問題のある関数の安全性や効率を改善できる >・ 戻り値にconstを使うと、問題のある関数 >問題のある関数 メイヤーズ氏もついに演算子の多重定義をdisる境地に達したのか
605 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:23:01.73 ] 「定数式が必要です」と言われてしまいました……教えてください。 「sound_effect.h」に次のように書きました。簡略化しています。 #ifndef SOUND_EFFECT_H #define SOUND_EFFECT_H extern const int SOUND_EFFECT_MAX; class CSoundEffect{ public: CSoundEffect(); ~CSoundEffect(); void RaiseFlag(int Num); void LoadSet(int SoundSet_Num); void Play(); private: int File[SOUND_EFFECT_MAX]; int Flag[SOUND_EFFECT_MAX]; }; そして、「sound_effect.cpp」には次のように書きました。各関数の定義ははぶきます。 #include "sound_effect.h" const int SOUND_EFFECT_MAX = 45; CSoundEffect SE_Object; すると、SOUND_EFFECT_MAXが代入済みの整数定数とみなされていないのか、 「構造体または共用体中にサイズが 0 の配列があります」ということになってしまいます。 なお、extern const intではなく#defineを用いるようにすれば、エラーは出なくなります。 ですが、整数定数の定義には#defineではなくconstを使うようにしろと言われてきたので……
606 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:25:49.79 ] すみません、簡略化時に#endifを削ってしまいました。 「sound_effect.h」の末尾に#endifがあるものとしてお答えください。
607 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:28:02.72 ] enum { SOUND_EFFECT_MAX = 45 };でいいだろ
608 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:41:50.09 ] 俺ならメンバ変数にstatic const int SOUND_EFFECT_MAX = 45; ってやっちゃうな externだとリンクの時に初めて値が入るとかでコンパイル時にそういう風に使っちゃいけないんだろう
609 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:57:38.08 ] どうしてもexternでやりたいなら sound_effect.h extern const int SOUND_EFFECT_MAX= 45; sound_effect.cpp const int SOUND_EFFECT_MAX; だな
610 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 02:20:37.69 ] クラス定義はマクロじゃないからな。
611 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 04:44:22.33 ] const定数のリンケージがC++だと、Cと違ってそのモジュール内だけになるからだったか? そのルールって、C++は定数式で配列が初期化できるからあるってことかな?
612 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 05:03:50.99 ] 黙して共用ヘッダの無名空間に収めとけよ
613 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 07:34:46.83 ] 外部リンケージの const 定数は配列の要素数などには使えない仕様 内部リンケージ(const が付く場合はデフォルト)であっても、 実体定義より前には配列の要素数などには使えない 宣言だけでは無理で、コンパイラは 0 であると仮定してエラー復帰してコンパイルを続けるので 連鎖的に配列が 0 要素だとか変なエラーが出る class CSoundEffect{ public: static const int Max = 45; private: int File[Max]; int Flag[Max]; }; これでFA VC6のような化石コンパイラを使わない限りは大丈夫 VC6使うなら enum { MAX = 45 }; で
614 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 17:50:12.27 ] 皆さんありがとうございます。 おかげさまで解決いたしました。
615 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 18:50:22.14 ] こっちにしようかC++11スレにしようか迷ったけどこっちで。 template aliasで下のコードがエラーになる(clangで)のは何故ですか? barはfooの別名だと思うのですが。 -- template<typename T> struct foo{ /*empty */ }; template<typename T> using bar = foo<T>; template<template<typename> class T> struct zot { /* empty */ }; void qux( zot<foo> ){ /*empty */ } void quux( ){ qux( zot<bar>( )); // ココ }
616 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 19:52:51.68 ] >>586 俺も好き。Java使わさせられるとき 同等の機能が無いから不便で仕方ない。
617 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 19:54:39.53 ] >>615 未対応だからじゃね
618 名前:デフォルトの名無しさん [2012/04/18(水) 20:32:59.12 ] zot に bar を渡すときに foo のインスタンス化を要求するからだろ
619 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 21:33:36.47 ] fooのインスタンス化は出来るんじゃね? alias使わずqux(zot<foo>());だけならideoneでも通るし
620 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 23:47:55.07 ] C++規格素人だが>615はコンパイラの常識的挙動に照らしておかしくねえ? template<typename T> using bar = foo<T>; でbarを本当にfoo<T>の別名として使ってインスタンス化の片棒を担がせるには Tの型を明示的に与えるか、型推論できるような書き方であらねばコンパイラ困っちゃう 、希ガス
621 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 00:15:19.40 ] すわなち、(省略されている型パラメータUを補完したとして) template<typename T> struct foo{ /*empty */ }; のTはfooの自由変数だが、 template<template<typename U> class T> struct zot { /* empty */ }; において、 U,Tは束縛変数の1, 2であって、テンプレートzotの自由変数は 実は( template<typename U> class T )という全体である で、void qux( zot<foo> ){ /*empty */ } と書いたなら、この実体化では zotの自由変数( typename<typename U> class T)のTがfooでUがfooの自由変数T、と解釈できる (で、Uはzotの定義で使われないからUの定義が無くとも実体化できる。) 一方、qux( zot<bar>() )と書いたなら、barをfoo<T>の別名と解釈するときにTの定義が要るから、 上の話で言うUの定義が必要、という違いがある 、、多分、、
622 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 00:28:33.86 ] いま思いついたが>621説を検証するには、>615のコードの3行目を template<template<typename U> class T> struct zot { U x; }; に変更したときに4行目の void qux( zot<foo> ) { /*empty*/ } がエラーになるか確かめればある意味一応検証になる エラーにならなければ>621説は反証される
623 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 00:52:23.75 ] struct void std::wstring any(); return 3;
624 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 01:32:56.73 ] エイリアステンプレートはテンプレートとしては元のテンプレートと別物扱いってことなんだろ template<class X, class Y> class hoge {}; template<class X> using fuga = hoge<X, X>; みたいなときはhogeは引数2つのテンプレートでfugaは引数1つのテンプレートとしてふるまうから別物扱いするのが自然だし
625 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 18:36:57.09 ] WindowsXP以上,VC2003の環境です。 ある特定のウインドウの位置の変更や、サイズの変更があった場合に 通知を受け取るにはどうすればよいでしょうか? いまは、ループでずっとGetWindowRect()を呼んでいます。
626 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 18:41:08.73 ] イベントにWM_SIZEってなかったっけ?
627 名前:625 mailto:sage [2012/04/19(木) 18:51:46.80 ] >>626 監視対象が、自分の作ったウインドウ(アプリ)じゃないんですよね。 DLL作ってフックしないといけないんでしょうかね・・・。
628 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 19:23:52.04 ] ループ使わないなら基本的にはフックじゃね vista以降は上位権限のプロセスのメッセージは取れないらしいけど あと使ったことないけどCreateRemoteThreadっていうので何か出来るかもしれない
629 名前:625 mailto:sage [2012/04/19(木) 22:53:19.86 ] とりあえず、新しいプロジェクトでDLLを作って WM_SIZE,WM_MOVE,WM_MOVINGをフックできるようになりました。 それで、更新された新しいRECTをEXE側に渡したいのですが、 DLLからEXE側の関数を呼ぶにはどのようにすればよいでしょうか?
630 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 23:59:45.57 ] .exeの方にdllexportの関数って用意できないっけ? exeの方のウィンドウハンドルとってきてメッセージでもいいけど
631 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 00:23:32.12 ] セキュリティで弾かれるのはハンドルを取得する時だけで合ってた? 違うプロセスのウィンドウハンドルを指定してゴニョゴニョは問題ないっけ?
632 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 01:16:30.45 ] ヘンタイ仕様のAPIの話って、ここでして良いの?
633 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 01:22:36.10 ] Mayaのプラグイン作ってそんなかでFindWindowしてSendMessageしたりしてるけど特にはじかれはしてないなぁ、Windows7ね。 exeが多重起動してたらどれからとってくるかは知らね、目的は果たせたからあんま調べてない。
634 名前:631 mailto:sage [2012/04/20(金) 01:25:31.84 ] あ、ごめん ここC++スレだった。 でもWin32スレに書いてもまともな返答返ってこなさそうだし困ったもんだね。
635 名前:631じゃなくて633でした mailto:sage [2012/04/20(金) 01:26:30.15 ] たびたびごめんなさい。
636 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 02:11:53.23 ] Windowsは一度公開API群を再設計したほうがいい 仮想化でやってるのは内部的な整合性を保つ為だろうけど どうせなら今までの粗雑なAPIはレガシー化させて 整合性のあるAPIとして生まれ変わったほうがいい 現状の#defineだらけのヘッダーやら互換性の為に残されたAPIやらは 一度分離してくれたほうがみんな幸せになれる
637 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 02:12:40.39 ] >>636 Win64は随分まともになってるじゃないか
638 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 02:34:17.39 ] Win64? DWORD→DWORD_PTRのことかね
639 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 02:35:23.12 ] .netのクラスライブラリ群がネイティブになって winapiは、なくなるのじゃないの?
640 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 02:42:01.50 ] 現状では.NetのGUIはwinapiをラップしたものでしかないぞ…
641 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 03:04:20.32 ] メッセージとか継ぎはぎ感が否めないよな
642 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 03:53:34.34 ] C99対応を前提にして BOOLもbool型にしとくべきだろうね
643 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 07:01:04.44 ] >>636 WinAPI使わなきゃいいじゃん 使わない自由はある MSだって昔は.Net Frameworkで切り捨てるつもりだったんだし
644 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 08:40:17.72 ] だから WinRT を設計したじゃないか
645 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 10:42:47.33 ] WPFでGUI APIを一新したかったんだろうけど、普及しなかったな。
646 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 11:38:25.04 ] 粗雑で素朴なCのAPIでもABI的な意味で需要はあるし手間の点はQtとかのラッパで十分とも言えるし
647 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 12:15:25.67 ] Windows8でAPIが近代っぽいのに変わるんじゃなかった? Win32APIとかのレガシーなのをやっととっかえる気になったと聞いたが
648 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 16:01:31.74 ] .netとかwinrtなんてvmじゃ、いつまでたってもwinapiは撲滅させられない
649 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 16:21:37.49 ] 俺もWinRTには期待してた ふたを開ければ機能限定版のWin32APIラッパだった Windowsにフタをしてやりたくなった
650 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 16:59:12.08 ] クラスについて質問です クラス内にメンバ変数しかなかったら newする度に変数の分だけメモリを消費するだろうと推測できるのですが 例えば、メンバ変数は2〜3個でも、メンバ関数が100個くらいある場合には newする度にメモリの消費量が半端ない感じになってしまったりしますか? クラスのメモリを確保した時の挙動がちょっと気になってしまいまして 詳しい方いらっしゃったら教えてくださいまし
651 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 17:12:53.29 ] >>650 こうかな?? ttp://ideone.com/8d2zK クラスのメンバ関数は普通の関数にthisを食わせる暗黙のパラメータがあるもんだと思ってもらえればイイと思うお。 だから、関数のインスタンスは、一個でいいし、最適化すればクラスに内包してる必要はないと思う。 ちなみに、テンプレート関数にするとちょっと事情が変わってくる。
652 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:02:11.61 ] template<typename T> class boo { friend class T; }; こんな具合にテンプレート引数をフレンドクラスにしたいのですが方法教えて下さい。
653 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:39:22.82 ] クラスのメンバでistream&をもってるんだけど、デフォルトは何で初期化すればいいの? class A { istream& is; A(): is(???) {} A(istream& is): is(is) {} };
654 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:41:08.84 ] 悪い事は言わないから参照ではなくてポインタを使いなさい。
655 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:41:11.70 ] 初期化できないのでA()は定義しちゃダメ
656 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:42:03.98 ] >>653 参照だと色々不便な気がするけど大丈夫なの? んで、デフォルトコンストラクタをProtectedにするとか・・・。
657 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:46:06.02 ] すまん、もちろんpublic:を忘れている。 ストリームの終端をA()で表現して、 iter!=A() 的な判定をするんだが、654の根拠は何? iostreamってあぶなっかしい?
658 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:50:04.32 ] >>657 いや、参照は初期化時以外に実態を束縛できないのでNULL参照になりやすいからアブネーという話だと思うよ。
659 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:53:19.88 ] istream&じゃなくてistream_iteratorとか持ったら?
660 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:54:35.39 ] コンストラクタを別の場所から呼び出すのにthisを使う、次のようなコード(拾ってきたもの) って規格的にはアリでしょうか? struct sample_class { int value; sample_class(int i): value(i) {} sample_class() { *this = sample_class(10); } };
661 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:57:04.04 ] ありだけどそれぐらいならsample_class() : value(10) { }ってしたほうがいいだろ
662 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:59:04.72 ] >>658 ふむふむ、あんまそういうのに遭遇したことがないからよくわからんが、 シングルスレッドでワンショットで終わっちゃう(走り続けない)ようなソフトでもヤバイのかね? >>659 そういう人もったことないけど、やってみるわ。アイディアありがとう。
663 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 22:02:31.54 ] >>662 実態が生きてるうちは大丈夫かな。デストラクタ走ったら死亡コース。
664 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 22:07:11.12 ] >>663 なるほど。自分が書くような小さいプログラムだと、 mainの最後だけでデストラクタ呼ばれるパターンが多いから、 いつも気にしてないんだよね。 でもこれからは気をつけてみるわ。ありがとう。
665 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 22:21:45.54 ] >>652 11ならこれで通る。(gccだと4.7以降) template<typename T> class boo { friend T; }; 98だと直接は無理でメンバ関数をfriendにするしかないかな codepad.org/Ako1qKqh
666 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 22:37:27.70 ] さっきのistream_iteratorを使えばいいという話ですが、これが通らない・・・ メッセージが邪悪すぎるから、誰か助けてくれ〜 #include <iostream> #include <utility> #include <iterator> using namespace std; istream& operator>>(istream& is, pair<int,int>& p) { is >> p.first >> p.second; return is; } int main() { istream_iterator<pair<int,int> > is(cin); }
667 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:16:13.35 ] グローバルフックするDLLからEXEに通知を受け取るために、 boost::functionをDLL側に渡して、DLLから呼び出したんですが デスクトップ、スタートボタン、タスクバーが消えましたww どうしたらよいでしょうか? (コンソールアプリや他ライブラリでDLLを使いまわしたいので、 ウインドウメッセージでは受け取りたくないんです) いまこんな感じです↓ >// EXE側 >boost::function<bool(STRUCT&)> func = &CallbackFunction; >StartHook(func); >//DLL側 >boost::function<bool(STRUCT&)> callbackFunc; >EXPORT BOOL StartHook(boost::function<bool(STRUCT&)> &func) >{ > callbackFunc=func; > : > callbackFunc(struct); >}
668 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:23:33.48 ] >>667 そんなことできるわけねーだろアホか
669 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:42:36.38 ] >>666 あんまりいいサンプルじゃないけどこういうのも有るよ的な。 ttp://ideone.com/qaals 正直、std::cinは使ったこと無いからメチャクチャ大変だった。そして、勉強になった。
670 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:47:36.28 ] >>669 う〜ん、求めているものではないなぁ。 とりあえず、コンパイルエラーの意味がわからんかったんだが、 それに関して何かコメントない?
671 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:51:02.72 ] >>670 テンプレートを使った実装を使うときにエラー起こすと意味不明な文字の羅列が出て上級者でもイラッと来るらしい。 で、コンセプトっていう機能が入る予定だったけど、ウヤムヤになって空中分解した。 コンセプトがあればエラーメッセージはもっとシンプルになる予定だったそうな。
672 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:58:11.19 ] 別に空中分解したわけじゃないよ コンセプトマップをユーザーが定義すべきか自動で定義されるべきかが決まらなかったのでC++11に入らなかっただけ
673 名前:650 mailto:sage [2012/04/20(金) 23:59:43.85 ] >>651 さん virtutal属性とかテンプレート関数の有無が鍵になる感じなのですね! 便利なクラスにする為に大量にメンバ関数を作る分には問題ない事が分かったので 安心してクラスを作り込みたいと思います。 ちょっと返信遅れちゃいましてごめんなさい。 どうもありがとうございました!
674 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 00:00:12.19 ] すまん。ちょっと誇張した。
675 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 00:01:13.04 ] >>674 -> >>672
676 名前:デフォルトの名無しさん [2012/04/21(土) 00:03:44.63 ] >>672
677 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 00:03:57.15 ] >>671 メタプログラミングとかでエラー出ても、メッセージの雰囲気でけっこうわかるんだが、 stringとiostream関連はいまだに読めないw
678 名前:デフォルトの名無しさん [2012/04/21(土) 00:09:21.77 ] >>666 は神待ちです。
679 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 00:12:42.02 ] パンピーで悪かったわね。
680 名前:677 mailto:sage [2012/04/21(土) 01:11:26.04 ] すいません、色々調べましたがギブアップです。 EXEからDLLにコールバック関数を登録して、DLL側から構造体を受け取るにはどうすればよいでしょうか? EXE(またはコンパイラ)が変わってもDLLを修正せずにできる方法でお願いします。
681 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 01:38:32.64 ] shared_ptr使えばいけるじゃないの?
682 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 01:48:01.02 ] exeが適当なウィンドウを作って dllがFindWindowでexeが作ったウィンドウを見つけて そのウィンドウハンドルにWM_COPYDATAで構造体を送り付けたらいい
683 名前:677 mailto:sage [2012/04/21(土) 01:54:10.77 ] コンソールアプリや関数だけのライブラリからも呼びたいので、 メッセージは使いたくないんです>< 関数ポインタはDLLとEXEでアドレス空間が違うんですかね>< >// EXE側 > >bool CALLBACK func(STRUCT struct){ > return true; >} > >int main(){ > StartHook((LPVOID)&func); > : >// DLL側 >EXPORT BOOL StartHook(LPVOID func) { > STRUCT data; > data.dat = 0; > > bool (*callback)(STRUCT); > callback = (bool (*) (STRUCT))func; > callback(data); // ←この次の行の関数呼び出しでランタイムエラー >
684 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 01:57:11.92 ] 共有メモリとか名前付きパイプとか
685 名前:677 mailto:sage [2012/04/21(土) 03:43:58.56 ] 共有メモリだと、フラグとか値が変わるのを無限ループで監視しないといけないですよね? それは無駄に重くなるのでやりたくないんですよね。。。 名前付きパイプ調べてみましたが、イベントってのが使えそうな気も・・・。 それと、DLLからEXEの関数呼び出しはなんとなくできました。 EXE側の関数をdllexportして、DLL側からEXE側にGetProcAddress()して関数アドレスを取得して 呼び出せました。これなら新しいEXEを作るときもDLLを変えずに済むかなと思ったのですが、 フックプロシージャからEXE側の関数を呼び出すと、なんかダイアログ出てきてシステムに無理やりDLLをとめられました・・・。 自分のミスなのか、フックプロシージャ内はなにか特別なのか??
686 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 03:48:34.25 ] 当たり前だろ フックされたプロセスとフックを仕掛けたプロセスは違うんだから 呼び出せるわけがない
687 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 03:59:22.71 ] どうでもいいけどC++関係ねぇ
688 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 04:01:23.44 ] そろそろ toro.2ch.net/test/read.cgi/tech/1333095907/ こっちに移るべきだな
689 名前:677 mailto:sage [2012/04/21(土) 04:04:56.72 ] >>686 そうなんですか・・・。 EXEと静的リンクしたDLLは同じプロセス空間、 DLLのフックプロシージャの中は別のプロセス空間ということでしょうか?
690 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 07:05:04.65 ] >>662 コンストラクターの引数は参照で、 内部ではポインターで保持したら?
691 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 09:49:36.25 ] c++ではmallocとfree関数はつかわないんでしょうか? newとdelete演算子ですか?
692 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 09:51:40.35 ] deleteも使わない
693 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 09:53:15.77 ] えっそうなのw 横から便乗で質問だけど、コンストラクタ・デストラクタ呼び出したい時はnew deleteなのはわかったけど その必要がない場合でもnew deleteすべき?
694 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 09:53:56.00 ] そんな質問する様なら、1つ良い事を教えてあげる。 混ぜるな危険!
695 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 10:17:08.33 ] newは遅いという説が・・・・
696 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 10:22:17.05 ] >>695 右辺値参照で改善に期待。
697 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 10:24:19.29 ] >>695 placement newでおk
698 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 10:53:22.07 ] newの中身は普通はただのmallocだよ 他にはコンストラクタも動かすけど、それはplacement newでも同じ
699 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 11:41:10.25 ] >>697 placement newを教えるからにはstd::aligned_storageもだな…。
700 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 11:42:27.96 ] そしてoperator new の闇に嵌まって逝く訳ですね
701 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 13:38:50.23 ] >>666 istream_iteratorの中からは自分でグローバルに定義したoperator >>が見えない(stdのoperator >>に隠蔽される)からエラーになる。 ・解決法の一つ。stdじゃない場所に自分で定義したクラスを介する。 class mypair { pair<int, int> p; public: mypair() : p() {} mypair(pair<int, int> const & p1) : p(p1) {} operator pair<int, int>() const { return p; } istream & readvalue(istream & is) { return is >> p.first >> p.second; } }; istream & operator >>(istream & is, mypair & pr) { return pr.readvalue(is); } int main() { istream_iterator< mypair > is(cin); pair<int, int> p = *is; }
702 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 18:01:10.22 ] >>691 malloc()は使用する必要性がほぼ0になるが 個人的にはrealloc()はしばしばまれに使うべ std::vector()が使えるならそれに越したことは無いが
703 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 18:15:42.26 ] >>702 > しばしばまれ どっちなんだよ…
704 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 18:19:38.93 ] reallocはPOD型(C++11では概念変わったけど)にしか使えないのがねえ まあ、環境依存でいいなら多少危険でも使えるケースはもうちょい多いと思うが
705 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 20:25:59.49 ] >>701 諦めてたのですが、有り難い限りです!
706 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 23:52:24.21 ] デフォルトのnewだとサイズsで取った領域をサイズs+1にしたいとき無条件にnewし直ししかないじゃん? realloc()はヒープ管理のリンクリストに直に触るから、サイズsの既存分を動かさずに済むことがある std::vector<T>が中で何やってるかは知らんが、案外realloc()を呼んでいるのではないか
707 名前:デフォルトの名無しさん [2012/04/21(土) 23:55:39.79 ] >>706 reserveで出来なかったっけ?
708 名前:デフォルトの名無しさん [2012/04/22(日) 00:01:56.82 ] newのデフォルトの実装は、環境やコンパイラに依存だろ。 reallocとかと混ぜる根性がよくあるな、おまえら。
709 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 00:02:23.30 ] >>706 実装によるけど一般的には、vector<T>は要求よりも多めに確保して現在の利用状況をリポートする。 領域確保時は、何だったかな、現在の1.5倍だったかの領域をnewしてコピーするんだったかな。 まー、実装依存だわね。
710 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 00:09:22.80 ] >>706 reallocなんで呼ぶわけないだろw 事前確保の容量超えたら新しくnewしてコピー/ムーブだよ >>709 GCCとMSVCがそれぞれ1.5倍と2倍(どっちがどっちか忘れた)だったはず
711 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:08:33.21 ] 勝手にコピーや元の領域の開放を行わないreallocがあれば vectorもどきを作るのに使えるのにね・・・ 伸ばせるなら伸ばす、伸ばせなければ失敗、 あるいは、新たな領域を確保して、それを返すだけ、という
712 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:14:34.54 ] >>711 誰がコンストラクタ走らせるの? そういう用途はプレイスメントnewという機構があるよ。
713 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:15:34.87 ] >>712 vectorがどういう風に実装されてるか知ってる?
714 名前:デフォルトの名無しさん [2012/04/22(日) 01:19:53.01 ] 実装を知らないと使えない、とか、 オブジェクト指向と言うかC++の思想に反するよな。
715 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:23:08.37 ] >>714 何を言ってるのか意味が分からない
716 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:23:30.27 ] >>713 詳しくは知らない。 でも、アロケータにメモリ確保を任せて帰ってきたメモリをプレイスメントnewしてるのかねぇ。 オブジェクトをプッシュバックしたら、コピコンかムーブで移譲だよね。 その段階で破棄されるオブジェクトのデストラクタ走るし。 俺はユーザープログラマだからそんな詳しく知らなくても使える。と、言い訳。
717 名前:716 mailto:sage [2012/04/22(日) 01:25:35.85 ] アロケータの実装がreallocであることもある可能性は捨て切れない。
718 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:29:43.11 ] reallocは絶対に使えないのよね 領域が移動する場合に、reallocが勝手に内容をmemcpyするから ちゃんとしたコピーなりムーブなりが行われない 逆に言えば、この領域移動さえなければ使えると言う事
719 名前:716 mailto:sage [2012/04/22(日) 01:32:35.49 ] ほぇ〜。そうなんだ。 アロケータのことはよく知らんのよ。実装する機会もないし。
720 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:36:35.68 ] newした内容をmemcpyでコピーできないのと同じ事さ アロケータの知識は正直あまり関係ない
721 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:37:04.38 ] ※ただしPOD型は除く
722 名前:716 mailto:sage [2012/04/22(日) 01:47:33.69 ] >>720-721 なるほど。勉強になるよ〜。
723 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:03:06.82 ] >>722 PODだろうとmalloc、realloc、freeは使うなよ おいおいnewで確保したか、mallocで確保したか 管理しきれなくなってバグの原因になりかねんから PODとCの関数で思い出したが、POD型にmemsetでゼロ 初期化するヤツなんなんだろうな。 Type value = {0}; こういう形で十分だろうに。
724 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:04:10.52 ] Type value = {}; こうだろ
725 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:11:14.53 ] >>718 >>720 それって、要素型Tにコピーコンストラクタが定義されていれば どうとでもなるんじゃねwwwwwwwwwww 代入と異なりコンストラクタは構築先が何であるかを問わないから (そうでない作りにすると普通の構築時に必ずバグって発覚する、) 生のメモリ領域を与えてから構築することができる 、、ハス
726 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:21:38.13 ] >>723 それ警告出すコンパイラあるから俺は使わない
727 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:23:10.78 ] >>725 reallocが内部でmemcpyするって言ってんじゃん コピーコンストラクタもoperator==もガン無視でbitwiseコピーされる
728 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:24:33.50 ] >>726 Cの仕様で定義されてるんじゃなかったっけ? 俺はそういうふうに習ったけど。 某らんどとかは、変数の初期化処理に警告だしたりするからな。あれは不味いだろうと思う。
729 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 03:00:04.36 ] 定義はされてるよ でも、初期化忘れか、意図的な0クリアかを コンパイラが機械的に判断するのは難しかろう
730 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 03:01:59.22 ] >>726 じゃあどうやって初期化してるの?
731 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 03:19:43.82 ] >>727 だからプレースメントnewでrealloc()した後にコピーコンストラクタで構築すればいいでしょキイッ www.geocities.jp/ky_webid/cpp/language/036.html というわけで、realloc()とプレースメントnewの組み合わせで 領域が増えたときのコピーの回数をしばしばたまに減らせることがある C++ばパフォーマンス命の言語
732 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 03:33:04.27 ] それともいっこ、単純にあらかじめ大きめの容量を確保しておくという戦略は 使わないかもしれないオブジェクトについてデフォルトコンストラクタを呼んでしまう欠陥がある コンストラクタというのは初期化しか仕事しないから高速を要する処理中に極力呼びたくないわけよ この意味でも常にぎりぎりの領域サイズでrealloc()しつつプレースメントnewというのは 高速処理中にちまちまstd::vec<T>のインスタンスを生成するのに比べたらかなり手堅い (本当に手堅いのは高速を要する処理開始前に必要なサイズを全部確保しておくことだが)
733 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 03:49:59.13 ] 命令型言語のPGで新規の領域を不定値のままにして気持ち悪くない奴はカス なぜなら、命令型言語を選択したPGはその時点でチューリングマシン教の教徒であり、 チューリングマシンは状態の書き換えによって計算を進めるモデルだからだ そのためのType a = { }だったり(new Typeではく) new Type() 構文だろうノシ
734 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 04:03:38.84 ] >プレースメントnewでrealloc()した後にコピーコンストラクタで構築 とか意味が分からないけどとりあえず >使わないかもしれないオブジェクトについてデフォルトコンストラクタを呼んでしまう std::vectorもそんな挙動はしないよ?
735 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 04:39:50.99 ] >>734 >std::vectorもそんな挙動はしないよ? ちょっwwwwごめwwwwwwwwっうぇwwwwVS2010のstd::vector<T>で今調べたらそうだったわwwwwwww (確保した要素数しかデフォルトコンストラクタが呼ばれた) >意味が分からない サソプル イズ ベスト: struct TypeB { int x; TypeB() : x(-1) { } TypeB(const TypeB& other) { x = other.x + 100; } }; // コピーされたら100足される void test2() { const int n = 100; TypeB* sizableArray = (TypeB*)realloc(0, sizeof(TypeB) * n); for (int i = 0; i < n; ++i) { TypeB a; a.x = i; new(sizableArray + i) TypeB(a); // It's new! } for (int i = 0; i < n; ++i) cout << "sizableArray[" << i << "]=" << sizableArray[i].x << endl; } 実行結果は、sizeableArray[0] = 100\c\rsizableArray[1]= 101\c\r...
736 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 08:46:29.23 ] 語るね〜 終わったら呼んで。
737 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 13:56:10.85 ] >>731 bitwiseコピーした後にどうコピコンすんだよ 既にアドレス変わってる上に、初期化元は自分自身だろ
738 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:11:44.62 ] >>737 >new(sizableArray + i) TypeB(a); // It's new!
739 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:25:17.62 ] >>738 a って何だ?
740 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:27:32.56 ] >>739 アドレスsizableArray + i以外の場所にあるTypeB型のオブジェクト
741 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:29:39.39 ] 元データを論理的に保存しないといけないのに なんで別のものでコピコンすんの?
742 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:34:26.68 ] >>741 コピコンで元データが論理的に保存されないとする根拠は? >735のサンプルにおけるTypeBのコピコンにおいて、仮に100を足すのをやめたら >738で(スタック上の)aと論理的に同じオブジェクトがアドレスsizableArray + iにできるわけだけど?
743 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:35:49.79 ] >>742 そもそも、realloc したら元データが元の場所から無くなるんだよ
744 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:41:54.04 ] というか、>>735 読んでなかったが、今話してる事じゃねえよこれ vectorの伸張の話してんだぞ?
745 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:46:30.01 ] >>743 ああスマン、それはそうね p1がTypeBのコピー元配列srcArrayを指しているとして、 TypeB* p2 = realloc(p1, sizeof(TypeB) * n) の実行後、p2 != p1でありなおかつsrcArrayの要素がsrcArray内の他要素のアドレスに依存するならそうね しかし>702以降の流れはstd::vector<T>との比較という文脈なのを思い出してホスイ、 Tにそのような型が許されるだろうか?
746 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:56:54.97 ] >>711 からの流れだと思ってたのだがまあいいや
747 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 18:51:11.01 ] >>731 意味が解らん。reallocで1度コピーreplacement newでもう一度初期化。 処理が遅くなるだけだろ何のメリットが有るんだ?
748 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 18:53:19.14 ] >>733 命令型ってbashとかzshだろ メモリ確保は自動で行われるから 確保も開放も意識する必要は無い
749 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 18:54:29.33 ] あれだけruby厨だったuy( >>735 )がC++に手を出すようになったか
750 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 19:00:12.55 ] >>735 その内容ならmallocでいいだろ
751 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 19:04:47.26 ] >>730 memset か std::fill に決まってるジャン(std::fill_n は警告出る事あるのでやはり使わない) = { 0 } は可読性に劣るとも思うしね 初期化忘れか意図的な 0 クリアかが コメント残さないと確実に伝えられないから 最初の 0 がある意味マジックナンバーじみているのも気持ち悪い
752 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 19:30:08.71 ] 普通構造体に = { 0 }してたら初期化だと思うがな。 あと組み込み向けのしょぼいコンパイラーだとこっちの方が早いことがある 逆にmemsetの方が早いってのは聞いたことないけどね
753 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 19:43:36.33 ] >>751 それ初期化じゃないじゃん。 それに ={}; で初期化し忘れと読み取るアホはおらんよ。
754 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:04:39.00 ] = { }; は C で使えないよね
755 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:09:06.33 ] 使えないけど、それがどうかしたの?
756 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:13:57.52 ] 知らない人が結構いそうだから使いたくないわ
757 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:24:10.37 ] >>747 >reallocで1度コピー 領域拡大時であってもrealloc()だとコピーが起きないことがある 縮小時はもちろんほぼ常に起きないことが期待できる >replacement newでもう一度初期化。 誰も2回も初期化しないわけだが つかデフォルトのnewは使えば必ずメモリ確保してから初期化するのに対し、 プレースメントnewはそれ自体はメモリ確保しないから、 メモリがすでに確保されている場合はより早いの ワカル?
758 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:38:05.66 ] >>757 理解出来てないなら黙ってろ
759 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:38:21.85 ] >>748 ソウジャナイ 破壊的代入が本質的(それ無しには何事も進まない)のが命令型言語、 非破壊的代入で全て済ますのが関数型言語 前者はチューリングマシン、後者はλ式をそれぞれ数学的基礎とする 一方で書けるアルゴリズムは他方でも書けるという意味で両者の計算能力は等価 ただし得手不得手はもちろん違う
760 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:41:11.32 ] >>758 どこらへんがおかしいのかkwsk つかrealloc()が勝手にコピーするとオブジェクト必ず壊れるとか思ってる? std::vector<T>の要素型として使える型Tについてはそれは心配せんでええ
761 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:50:37.51 ] >領域拡大時であってもrealloc()だとコピーが起きないことがある >縮小時はもちろんほぼ常に起きないことが期待できる どういう理屈なんだ?
762 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:51:25.25 ] >>759 お前が言ってるのは手続き型だろ
763 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:54:06.90 ] >>759 関数型は、演算式と制御文を全て関数で記述する事を目的とした言語 破壊的代入が無いというだけだと宣言型とダブるので、 破壊的代入が無い = 関数型というのはおかしい
764 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:03:04.70 ] >>761 K&Rの終わりぐらいに書いてあるmalloc()の実装例でも読めばおk サイズs1、s2の領域がこの順で隣接しており、s2が開放されたなら サイズs1をサイズs1+s2までコピー無しで拡大することができる (※簡単のため管理用のヘッダサイズは無視) >>762 関数型言語であってもリストで手続き(順序的な処理)を表わせるから 手続き型/非手続き型の区分は命令型/関数型の切り口とは異なる別概念 Prologみたいに処理の順序が平に書かれない言語を非手続き型といい、 手続き型というのはそれの対義語
765 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:12:41.32 ] >>763 宣言型というのは、ようわからんが非手続き型っていうのとほぼ同義ジャネ? 破壊的代入無しでチューリングマシンの計算能力と等価な言語、 といえば多分λ式ベースの言語(つまり関数型言語)しかないんじゃないかなあ、、 なお、関数型は、(関数で)新しい関数を作り出すことしかしない故に関数型
766 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:12:47.96 ] >>764 mallocじゃなくreallocの内部の話なんだけど 実際コピーしない処理系が存在するのか? gccのreallocはソース公開されてるがコピーしてる 実際どの処理系がしてるんだ? 普通に考えてもmalloc内部の実装に依存するreallocなんてクソだろ
767 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:15:18.80 ] >>764 >関数型言語であってもリストで手続き(順序的な処理)を表わせるから >手続き型/非手続き型の区分は命令型/関数型の切り口とは異なる別概念 >Prologみたいに処理の順序が平に書かれない言語を非手続き型といい、 >手続き型というのはそれの対義語 お前だけの常識で語られてもなぁ
768 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:32:45.54 ] >>766 realloc()をmalloc()と別階層とすべきですかそうですか、、 コピーを生じない処理系の具体例については、 少なくとも下記コードをVS2010で走らせるとp1 == p2なんだけど? void* p1 = malloc(1000); void* p3 = malloc(1000); free(p3); void* p2 = realloc(p1, 2000); cout << "p1=" << p1 << ", p2=" << p2 << endl; glibcのソースをよく読みなおすことをお勧めする >>767 漏れだけの常識がどうかはようわからんが、そうなの? >764で妥当だと思うがなあ〜
769 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:35:05.31 ] で、いつまでちんたらちんたら続くんだ?
770 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:36:14.02 ] >>760 おいおい、オブジェクト領域でreallocなんか使ったら壊れるだろうがw ポインタ関係が全部おかしくなるわ。
771 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:38:31.10 ] >>768 サイズ変更が「可能な場合」はコピーされない。不可能な場合はコピーされる。 コピーされる場合はありえるんだが、たまたま特定環境化で動作するから使っていいとかアホの極み。ドシロウト。 仕事でそれ使ってたらリアルで背任でクビになるようにもっていく。
772 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:39:33.64 ] >>768 そのコードじゃそりゃそうだろ。 つかそのコードはreallocの問題じゃねぇ。言い方悪かも試練が偶然だ。 解放された領域をもう一度使用してるのは意図して書けばできる事だが、 reallocが同じ領域であることを知っててコピー処理を省略してるかどうかは別問題。
773 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:40:57.09 ] >>770 >ポインタ関係が全部おかしくなるわ。 ポインタを含まないか、ポインタを含んでも指す先が移動対象でないなら そういうオブジェクトは勝手にコピーされても無問題でしょ? で、std::vector<T>の要素型として使えるような型Tのオブジェクトなら、それは成立している、というしくみ
774 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:45:00.34 ] >>771 >>772 まあ冷静に コピーされる場合がありえるし、コピーされる/されないを realloc()の呼び出し側で制御できないのは承知していますから ただ、std::vector<T>の要素型として使えるような型Tのオブジェクトなら、 プレースメントnewをうまく使って安全にrealloc()で領域管理できるという話
775 名前:デフォルトの名無しさん [2012/04/22(日) 21:54:51.43 ] マジレスしないでニヨニヨ笑ってる人が絶対いる悪寒 あまりにも不自然すぎる
776 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:56:42.25 ] >>774 二重コピーされる分realloc使うのが無駄なのは事実だろ まだmalloc, free, mallocしてreplacemente new呼んだ方がマシだ
777 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:06:36.44 ] >>776 ちょっと前のレスから気になってたが、replacement newってなんぞね? また、realloc()の呼び出し1回で同一オブジェクトのコピーが2回起きるみたいな書き方も気になるが、 それっていつどういうシチュで?? もし>738のようなコピーコンストラクタ呼び出しの回数のことを言ってるのなら、 それはrealloc()一回につき同一オブジェクト当たり1回以下にできる (realloc()がコピーするかしないかや呼び出し下で制御できないが、 領域の移動があったかどうかは呼び出し元で判定でき、移動しなかったオブジェクトについて呼ぶ必要はないため。)
778 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:08:51.64 ] その程度の処理が問題になるなら動的確保自体使わなきゃいいだろ。 まずはEffectiveC++でも嫁やザコ
779 名前:777 mailto:sage [2012/04/22(日) 22:10:35.64 ] スマン訂正 std::vector<T>の要素型として使えるような型Tのオブジェクトなら、 勝手にコピーされても何もする必要がないから、領域の移動は関係なかったな、、
780 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:14:06.10 ] >>777 reallocで1回、new( buffer ) Type();で1回、合わせて2回だろ。
781 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:23:58.97 ] >>773 自分自身をさすポインタをもつ場合、コピーコンストラクタ/operator=を正しく書けばvectorに入れられるが、メモリコピーでは正しく処理できない。
782 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:34:14.86 ] >>780 普通そうはならないべ サイズs1の領域が確保済みで、realloc()でそのサイズをs1+s2に拡大する場合、効率的な実装なら、まず>764(の前半)のようなケースでは実質コピー0回。(空き領域リンクリストの繋ぎ替えが起きるだけ。) 運が悪ければ、領域の移動を要し、サイズs1の部分のみコピーされる(コピー1回)。 ここには今の想定だと構築済みオブジェクトが入っているが、コピー安全なオブジェクトなのでそれ以外なにもしなくていい。つまり、コピーはオブジェクト毎に高々1回。 で、new(p) Type(); が必要なのは、新規に確保されたサイズs2の領域だけ。よって、2回コピーされるオブジェクトは生じない。 なお、細かいことを言えば、new(p) Type()はアドレスpについてType型のデフォルトコンストラクタを呼び出すだけなのでコピーではない。 また、Typeのデフォルトコンストラクタが全フィールドを確実に初期化する保証があるなら new(p) Type(); と書くより new(p) Type; の方がよろしい。(0 fillが省略されるから早くなる。いつの規格からかは知らん。) >>781 ああすまん、それはそうね。
783 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:41:23.02 ] >>782 >サイズs1の領域が確保済みで、realloc()でそのサイズをs1+s2に拡大する場合、効率的な実装なら、まず>764(の前半)のようなケースでは実質コピー0回。(空き領域リンクリストの繋ぎ替えが起きるだけ。) この前提が間違ってるって何度も指摘されてるだろ
784 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:45:14.75 ] >>782 手間が増えるだけでreallocするメリットねぇじゃねぇか
785 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:45:21.40 ] >>783 >何度も指摘 kwsk すくなくとも、(たまたまかどうかはともかくとして)realloc()前後で領域が移動しなかった実例が>768にあるわけだが これって呼び出し前後でアドレスが変わらない部分についてもrealloc()は律儀にコピーしてるってことなの?? >738おすすめのヒープメモリ管理方式を聞いてみたい気がするカモメ、
786 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:49:16.76 ] >>785 ことなの?じゃなくコールスタック追いかけるか 逆アセしてみろよ。memcpy呼ばれてるだろ
787 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 23:06:31.08 ] >>786 VS2010のデバッグモードでmemcpy()にブレークポイントしかけて見て見たが、 >768のコードにおける4行目 void* p2 = realloc(p1, 2000); の呼び出し中のmemcpy(src, dst, count)の呼び出し回数は3回、ただしcountはどれも2だったべ これはリンクリストか何かのコピーじゃねーの? (>783の指摘どおりだとしたら1000バイト級のmemcpy()が起きないとおかしいが) で、仮に万が一>783の指摘が正しかったとして、2回コピーされる件はどうなったのよさ? 主張を取り下げて>782で納得?
788 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 23:09:34.08 ] 不毛だ
789 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 23:27:27.52 ] >>787 2回コピーは俺だが。新しい領域のみコンストラクターの結果を コピーするんならたしかにコピーは1回だな。そこは納得するよ。
790 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 23:45:41.19 ] >>787 codepad.org/tlYgmcrc そもそも、同じアドレスだからと言って一旦解放された領域に 同じ値が入ってるとも限らんからな このコードVSにコピペして実行してみ
791 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 01:13:06.56 ] >>790 ちょっwwwwwwおまwwwwwwwwww 例示のコードはrealloc()とは話が違うわけだが そりゃーfree()で本当に解放してしまった領域には誰に何書かれるかわからんでしょうよ (別スレッドあり、デバッグビルドのfree()だと丁重に0xccccccccで埋めてくれたりすることあり。 セキュリティー目的で埋めるライブラリもあるかも試練、) なんつーか>768のコードの意図が伝わってないようだけど、 K&R式なmalloc()およびrealloc()な実装の下で>768をシングルスレッド状況で走らせると >782で言うコピー0回な挙動になるんすよ >768は、その挙動を演出するために、使用中の領域(p1)とは関係ない領域(p3)を一旦malloc()後にfree()してるだけ p1が指す領域は一貫してfree()されない。
792 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 01:26:27.20 ] >>779 vector の要素型に realloc() で発生しうる memcpy() への耐性なんて要求されてないんだが
793 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 01:43:35.76 ] >>791 realloc内部でfreeされるがな
794 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 02:08:56.95 ] だから、C++ならnewだけを使えよ。 わざわざ危険を犯そうとする冒険者になることは、ない。
795 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 02:19:24.31 ] newの使い方よりも newそのものの速度が問題になる状況って どんな状況だ?
796 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 03:05:19.97 ] もうほっとけよ
797 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 03:19:14.56 ] class MyClass{ public: bool hoge(); } MyClass instance; があるとして、 「instance.hoge()」 が与えられたときに、 「MyClass::hoge(),&instance」 を返すようなマクロは作れませんでしょうか?
798 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 04:24:58.06 ] メンバ関数ポインタ
799 名前:797 mailto:sage [2012/04/23(月) 04:25:55.73 ] なんとか、 「instance.hoge()」 という記述から、メンバ関数ポインタとthisポインタを取得したいんですよね。。。
800 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 06:50:18.40 ] 「&MyClass::hoge,&instance」が欲しい理由じゃないのか?
801 名前:797 mailto:sage [2012/04/23(月) 12:43:53.90 ] これが欲しい理由は、一度&MyClass::hogeと&instanceを保存しておいて、 あとでそのメンバ関数を呼び出したいんです。 使う箇所が多いので、テンプレートとかでなんとかできないかと思いました。
802 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 12:53:08.14 ] std::bindとstd::functionでおk