1 名前:デフォルトの名無しさん [2009/07/18(土) 02:54:58 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part70 pc12.2ch.net/test/read.cgi/tech/1244942050/l50
369 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:58:44 ] >>367 この手の場面に相当するような「デカい仕事」では、実際結構な確率で いま出ているような物を使うことになると思う。
370 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:02:12 ] 危険な機能を使わないためと言って変な黒魔術で無理矢理回避する方がよっぽど危険だしな
371 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:25:27 ] Windowsでプログラムしていると reinterpret_cast と dynamic_cast のオンパレードですよ^^
372 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:30:33 ] >>371 キャストが必要になるのはわかるが、オンパレードはおかしいだろ。 同じ意味のキャストはてきとうにラップしろよ。
373 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:39:44 ] ダウンキャストの意味わかってるのか? 存在しないメンバにアクセスして鼻から悪魔が出るのを承知で 使わないといけないんだぞ
374 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:43:35 ] HWND(構造体へのポインタ)をCWndクラスにキャストさせたり、Windowsプログラミングは楽しいなぁ^^
375 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:12:24 ] C++やりたての頃はこういう鼻から悪魔の意味もわからなかった #include <iostream> class Base { int i; public: virtual void print() const { std::cout << "Base" << std::endl; } }; class Derived : public Base { public: void print() const { std::cout << "Derived" << std::endl; } }; int main() { Base *p; p = dynamic_cast<Derived*>(new Base); p->print(); // ouch! }
376 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:17:31 ] >>375 これはどの辺が鼻から悪魔?
377 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:18:56 ] >>376 BaseにはDerived::print()がない 実行してみればわかるが正しく動かない
378 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:20:46 ] >>376 dynamic_cast<Derived*>(new Base) この結果がヌルポインタになる。 その後の p-> でヌルポインタをデリファレンスして未定義動作。
379 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:21:39 ] >>377 えっ?
380 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:25:38 ] ごめんこういう場合に使うんだったね #include <iostream> class Base { int i; public: virtual void print() const { std::cout << "Base" << std::endl; } }; class Derived : public Base { public: void print() const { std::cout << "Derived" << std::endl; } }; int main() { Base* p; p = dynamic_cast<Base*>(new Derived); if (!p) std::cout << "dynamic_cast failed." << std::endl; p->print(); // ouch! }
381 名前:376 mailto:sage [2009/08/09(日) 23:27:43 ] すみません >>377 と >>378 はどちらが正しいですか?
382 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:29:07 ] >>381 >>378 が正しい ダウンキャストはポインタが正しい本体を指している時にのみ成功する
383 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:37:32 ] >>380 これは何でouch!なの?
384 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:38:21 ] >>380 いや、 Derived* → Base* は暗黙変換で通るから、 dynamic_cast の出番じゃない。 しかも、せっかく dynamic_cast の結果にチェックを入れたのにメッセージ表示の後に 結局 p-> してたらダメじゃん。
385 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:40:07 ] わかんね dynamic_castの正しい使い方知ってる人教えて
386 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:48:07 ] DerivedがBaseとBase2を継承してるとして ・Derived* → Base* (アップキャスト) 常に成功し、Baseのポインタが得られる ・Base* → Derived* (ダウンキャスト) DerivedのBase部分を指してるポインタだったら正しいDerivedのポインタが得られる そうでなければヌルポインタが返ってくる ・Base* → Base2* (クロスキャスト) DerivedのBase部分を指してるポインタだったら正しいBase2のポインタが得られる そうでなければヌルポインタが返ってくる ・Base* → int* (無関係) 常にヌルポインタが返ってくる 参照の場合は、以上の「ポインタ」を「参照」、「*」を「&」、 「ヌルポインタが返ってくる」を「std::bad_cast例外が投げられる」に読み替えればいい
387 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 00:01:23 ] よく見ろよw >>375 のは p = dynamic_cast<Derived*>(new Base); どこにもDerivedのインスタンスは生成されない そりゃNULLが帰ってくるだろうって
388 名前:357 mailto:sage [2009/08/10(月) 00:18:37 ] >>358-359 ありがとうございます。 NaNについてはもっと勉強してきます。
389 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 00:45:20 ] >>369 そういう話ではなく > 「できればこれを使わずに済ませたいものだが・・・」 といったらそれは使うフラグ
390 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 01:35:06 ] >>389 まさにそういう話だと思うが。
391 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 02:23:56 ] 仕事のデカさは関係ないってことじゃないの?
392 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 12:33:39 ] dynamic_castの意味を今まで勘違いしてたわ ダウン・キャストしても安全に使用できるかどうかの判定なのね
393 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:40:20 ] VS2008のVC++MFCで ボタンクリックでピクチャーコントロールにjpgファイルの画像をサイズを変えて表示しています。 以下ソース CImage img; CImage img2; HDC hdc; img2.Create(80,60,24); img.Load("jpgファイルのフルパス"); hdc = img2.GetDC(); SetStretchBltMode(hdc, HALFTONE); img.Draw(hdc, 0, 0, 80, 60); img2.ReleaseDC(); m_xcPic01.SetBitmap( (HBITMAP)img2 ); img.Destroy(); img2.Detach(); img2.Destroy(); jpgファイルが変わる毎に、画面上の画像も切り替えたいので 上の処理を呼び出して、画面を切り替えてます。 しばらく動かしていたところで気付いたのですが、 メモリの使用量がかなり多くなっていました・・・ ファイルロード側のDestroyやリサイズ後側のDetach、Destroyだけでは解放してくれないのでしょうか? わかる方、または参考になるサイトやスレをご存知の方、よろしくお願いします。
394 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:45:28 ] Detachしてしまったビットマップは削除されないのでは
395 名前:デフォルトの名無しさん [2009/08/10(月) 15:48:42 ] ヘッダーに変数を定義することって出来たんでしたっけ? いや、さっき書いてみたら出来たんで、ちょっとびっくりしたんですが。 インクルードガードしてないとエラーが出るってだけなのかな。Cではどうなんでしょう。 まあ、作法としてはインクルードガードしててもやっちゃダメなのかもしれないですけど。ですよね?
396 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:54:56 ] 本当ならリンカが多重定義のエラーを吐くはずだが、デフォルトでは吐かない奴もいる
397 名前:393 mailto:sage [2009/08/10(月) 15:58:12 ] >>394 レスありがとうございます Detach後にDestroyすると、メモリ上に残る・・・ つまり、リサイズ後用のimg2がどんどん溜まっている状態 ってことでしょうか? ためしにimg2.Detach();をコメントアウトして動作させると、 別ウィンドウの後ろに隠れると画像が消えると言う症状がでました。 私、根本的に作り方を間違えているのかも・・・
398 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 16:18:59 ] >>397 MFCスレでやってくれ
399 名前:393 mailto:sage [2009/08/10(月) 16:28:29 ] >>398 MFC相談室の方に移動させていただきます。 スレ汚しすみませんでした。
400 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 16:45:42 ] >>395 ヘッダだからできない事というのはないよ やるべきじゃないことは、ある。
401 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 17:42:52 ] >>400 >ヘッダだからできない事というのはないよ へー、そうなんですか。 逆に、ソースだとできないことってのはありますよね? テンプレートの定義とか。
402 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:00:51 ] >>401 .hも.cppもC++の上では本質的には変わりないんだよ。 テンプレートの定義だって、別に.cppの上でやったっていい。 その定義が他の.cppから見えるかどうかは別問題だがな。
403 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:06:33 ] >>401 だからできないことはないって。 逆に聞くが、ヘッダとソースってどうやって区別してんの?
404 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:08:23 ] 定義そのまま他の.cppに丸ごとコピペすればいいわけだが、 後々修正する際に全部直して回るのが面倒だからそういうことはやらないだけだ
405 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:09:46 ] #include "header.cpp" この場合、header.cpp はヘッダなのかソースなのか
406 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:38:26 ] >>405 いわゆるクソコードってやつだよ。
407 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:46:46 ] オブジェクト指向について質問なんだけど。 クラスAのインスタンスをクラスBで作り クラスBのメソッドからクラスAのprivateにあるメンバ変数をゲッターセッターを使って弄る(クラスBのメンバ変数にも同期させる)。 そして、又クラスCのメソッドからクラスBにあるメンバ変数を参照して、判定なりをする。 そういう風に包含を重ねて行くのがオブジェクト指向なの? C++をやって間もないんだけど、俺のプログラムはこんな感じなんだ。 良いのか悪いのか分からない、アドバイスお願い
408 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:48:16 ] >>405 学生の時にバイトしていた会社のコードにそういうのがあった 日本のロケットがクソ高くて落ちるわけだ、と思った
409 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:54:57 ] クソコードでバグを入れて、 そのバグを取るのが仕事ですから それでいいんです。
410 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:56:03 ] >>407 俺はメソッドとかC++標準にない用語を使われても起こらない。 しかし >>クラスAのインスタンスをクラスBで作り これはどういう意味だい?
411 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:58:28 ] >>410 えっと クラスBのprivate領域に、クラスAの実体を包含するって意味で書いたつもりだった
412 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 19:03:01 ] >>406 クソかどうかは関係ない。 できないことがあるのかどうかが論点であり、やるべきではないことはまた別の話
413 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 19:44:54 ] >>407 >又クラスCのメソッドからクラスBにあるメンバ変数を参照して、判定なりをする。 クラスBでクラスBのメンバ変数を参照して判定するようにして、外からメンバ変数を 見せないように隠蔽するのが、オブジェクト指向のカプセル化の基本かな。 セッタ/ゲッタはそれを破ってしまうから避ける様に設計するのがお勧め。
414 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:12:31 ] 雪駄とか下駄はオブジェクト指向じゃないと個人的には思う。 単一責任原則をはたすためにも、 メソッドは単に状態を書き換えるだけでは十分でないと思うから。
415 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:15:25 ] セッタ/ゲッタは最終手段であり、 それに突入した瞬間からクソコードが始まると考えて 「一般には」さしつかえないくらい。
416 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:33:13 ] C++ code - 95 lines - codepad ttp://codepad.org/xR4PHa3G この std::numeric_limits の明示的特殊化のコードは、 g++ 4.4.0では問題無くコンパイル・実行できました。 しかし Microsoft Visual Studio 2008 Version 9.0.30729.1 SP では error C2910: 'std::numeric_limits<MyTempl<MyInt>>' : 明示的な特殊化にすることはできません。 となり、コンパイルエラーとなってしまいます。 VCでも通す方法はありませんでしょうか? Compiler Error C2910 ttp://msdn.microsoft.com/en-us/library/cx7k7hcf(VS.71).aspx このあたりを読んでみましたが、よく分かりませんでした。 よろしくお願いします。
417 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:52:34 ] stdの中を無理矢理いじくってるからかなあ 多分ヘッダーlimitsのどこかとぶつかってるよ
418 名前:416 mailto:sage [2009/08/10(月) 20:56:41 ] std名前空間は 新しい物を追加したりすれば未定義の動作となる。 しかし関数・クラステンプレートの特殊化のみ 認められる。 ということは知っているのですが、 私のやり方がまずいのでしょうか。。。
419 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:57:14 ] template <typename MyInt> この行いらない
420 名前:416 mailto:sage [2009/08/10(月) 21:04:44 ] すみません。 その辺確かにまずかったです。 C++ code - 95 lines - codepad ttp://codepad.org/yovzUoIJ これはどうでしょうか? やりたいことは template <typename hoge_t> struct numeric_limits< MyTempl<hoge_t> > : numeric_limits< hoge_t > の部分で現れていると思います。
421 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 21:07:00 ] template <typename hoge_t> の前の template <> が要らないんじゃ
422 名前:416 mailto:sage [2009/08/10(月) 21:25:35 ] >>421 それで通りました! 皆様ありがとうございます。 本気で助かりました。。。
423 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 21:32:54 ] そのままで通るBCC6.1.3は欠陥コンパイラという事か
424 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 21:36:47 ] いやg++も通っているから別に欠陥ではないのでは? VCが厳しいのかな。 g++ + 訂正前 -> 通る g++ + 訂正後 -> 通る VC++ + 訂正前 -> 通らない VC++ + 訂正後 -> 通る BCC6.1.3 + 訂正前 -> 通る BCC6.1.3 + 訂正後 -> ??? 訂正後はBCCで通る?
425 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 21:43:25 ] >>424 訂正後も通るよBCC
426 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 21:47:26 ] g++ + 訂正前 -> 通る g++ + 訂正後 -> 通る VC++ + 訂正前 -> 通らない VC++ + 訂正後 -> 通る BCC6.1.3 + 訂正前 -> 通る BCC6.1.3 + 訂正後 -> 通る じゃあ通る動作と通らない動作、 どっちが規格的には正しいのだろう?
427 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 21:55:42 ] BCCは歴代的にテンプレート周りが怪しいとして(もっとも 今回のバージョンからboostに部分的に対応しているんだが) g++が通ってるんだからvc++が厳しすぎるんじゃね?
428 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 22:29:15 ] @aaaaaaaaa.cpp ttp://codepad.org/8b4slwrj こうすると、VC++では error C3767: 'foo': 候補の関数はアクセス可能ではありません。 'aaaaaaaaa.cpp(26)' の friend 関数である可能性があります : 'foo' [引数依存の 照合を使って検出される可能性があります] というエラーになります。 ところが namespace MyNS を外してグローバルスコープにすると ttp://codepad.org/nBmNHA3H このコードのようになりますが、VC++で通ります。 なお、g++ではどちらも通ります。 Aまた、//問題の箇所2の行をコメントアウトした C++ code - 50 lines - codepad ttp://codepad.org/J3kjckz1 はg++, VCどちらも通らなくなります。 (インスタンス化されていないため?) @Aの問題の原因としては //問題の箇所1 あたりのやりかたがまずいのかと思っているのですが、 正解のコーディングをご教示いただけますでしょうか? よろしくお願いいたします。
429 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 22:55:18 ] BCC6.1.3はg++に準ずる結果となりました VC++だけ挙動が違うね
430 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 23:07:02 ] VC++, g++, BCC 以上に 標準C++準拠度が高いコンパイラって無いのかな? 性能は悪くても良いから標準C++準拠度だけを命にしているコンパイラ。
431 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 23:17:19 ] Comeau C++とかか?
432 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 23:20:27 ] using namespace MyNS;で通るね MSDNによると Friend function names are no longer introduced into containing namespace だそうなのでMyNS::fooの時点でADLが利かなくなるってことかな?規格なんて読んだことないから知らないけど。
433 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 23:22:02 ] 補足 using namespaceしてからMyNS::fooをfooだけに
434 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 23:34:50 ] 違いますか? どのあたりが違いますか?
435 名前:430 mailto:sage [2009/08/10(月) 23:35:35 ] Comeau C/C++ - Wikipedia, the free encyclopedia ttp://en.wikipedia.org/wiki/Comeau_C/C%2B%2B こんなん初めて聞いた俺がいる。 ありがとう。>>431
436 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 23:36:44 ] 事実上exportキーワードに対応させてるコンパイラは 今の所これだけだしな
437 名前:434 mailto:sage [2009/08/10(月) 23:37:55 ] 誤爆しました。 失礼しました。
438 名前:428 mailto:sage [2009/08/10(月) 23:56:23 ] Comeau C++のWebサイトで で ttp://codepad.org/J3kjckz1 を実行してみました。 Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2 Copyright 1988-2008 Comeau Computing. All rights reserved. MODE:strict errors C++ noC++0x_extensions "ComeauTest.c", line 44: error: namespace "MyNS" has no member "foo" MyNS::foo<double>(MyNS::MyTempl<MyNS::MyInt>()); ^ "ComeauTest.c", line 44: error: type name is not allowed MyNS::foo<double>(MyNS::MyTempl<MyNS::MyInt>()); ^ 2 errors detected in the compilation of "ComeauTest.c". だそうです。
439 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 00:01:41 ] という事は例のダイヤモンド継承のバグを除けば VC++の方が標準に近いわけか
440 名前:428 mailto:sage [2009/08/11(火) 00:05:46 ] >>420 の ttp://codepad.org/yovzUoIJ のtemplate <>あり&無しについて g++ + 訂正前 -> 通る g++ + 訂正後 -> 通る VC++ + 訂正前 -> 通らない VC++ + 訂正後 -> 通る BCC6.1.3 + 訂正前 -> 通る BCC6.1.3 + 訂正後 -> 通る Comeau C++ + 訂正前 -> 通らない Comeau C+++ 訂正後 -> 通る でした。
441 名前:428 mailto:sage [2009/08/11(火) 00:07:05 ] >>428 の@の ttp://codepad.org/8b4slwrj ttp://codepad.org/nBmNHA3H は両方とも通りません。 (VC++で通った)グローバルスコープにおいたら方のttp://codepad.org/nBmNHA3H でも Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2 Copyright 1988-2008 Comeau Computing. All rights reserved. MODE:strict errors C++ noC++0x_extensions "ComeauTest.c", line 41: error: identifier "foo" is undefined foo<double>(MyTempl<MyInt>()); ^ "ComeauTest.c", line 41: error: type name is not allowed foo<double>(MyTempl<MyInt>()); ^ 2 errors detected in the compilation of "ComeauTest.c". となりました。 どうやらComeau C++が正しいとすれば、 私の@のコードはどちらも「通る方がおかしい」コードという事になるようです。
442 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 15:32:28 ] 気になったので少し調べてみた でも憶測も入ってるので間違ってたら突っ込みキボン 1. グローバルかMyNSかで違う クラス内で定義されたfriend関数はADLを通してしか利用できないっぽい なので、定義をグローバルに置いたからじゃなくて、 利用側で名前空間を指定しなくなったからコンパイルが通るようになるんだと思う 2. それでもComeauでは通らない これはワカンネ 関数テンプレートのテンプレート実引数が暗黙的に決まるようにして、 関数呼び出し時に明示的な指定をしないように変えたら、MyNSに入っていてもコンパイルできるようになった 明示的にテンプレート実引数を指定するとダメ 誰か理由を教えてくれ
443 名前:428 mailto:sage [2009/08/11(火) 15:55:47 ] ttp://codepad.org/405cfVvH とりあえずfooがテンプレートかつクラス内定義friend関数であることが問題である 可能性が高いと考え、 この様にbar関数(テンプレートでないクラス内定義friend関数)にしてみましたところ g++ 4.4.0 VC++ 2008 BCC5.5.1 Comeau C++ の4つで問題無くコンパイル・実行できました。 ちなみにbar(MyNS::MyTempl<MyNS::MyInt>());の場所を MyNS::bar(MyNS::MyTempl<MyNS::MyInt>()); にするとttp://codepad.org/wewb2LHcの様にエラーになります。 ::bar(MyNS::MyTempl<MyNS::MyInt>()); にしてもttp://codepad.org/hj2uJmG0の様にエラーになります。 グローバルスコープを明示的に指定するとダメになるところをみますと、 どうやら>>442 さんがおっしゃる1.が理由の一つである可能性が高いですね。
444 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 15:59:07 ] どこで聞いたのか失念したけど friendとtemplateを併用するとADLがうまく働かなくなるって話を 聞いた事がある
445 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 16:03:18 ] ちなみにbcc6.1.3では >MyNS::bar(MyNS::MyTempl<MyNS::MyInt>()); >にするとttp://codepad.org/wewb2LHcの様にエラーになります。 >::bar(MyNS::MyTempl<MyNS::MyInt>()); >にしてもttp://codepad.org/hj2uJmG0の様にエラーになります。 どちらも通ります どうもADL周りの作り込みが甘いのか構文解析の手抜きをしているのか
446 名前:428 mailto:sage [2009/08/11(火) 16:07:21 ] みなさんありあがとうございます。 とりあえずfriendにすることを諦めて、次のような逃げ道に走ってみました。 C++ code - 55 lines - codepad ttp://codepad.org/yBp6Lo3p こちらのコードは、 g++ 4.4.0 VC++ 2008 BCC5.5.1 Comeau C++ の4つで問題無くコンパイル・実行できました。 事前のインスタンス化なども不要なので、 逃げたような気がしてなりませんが一応解決はできました。。。
447 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 16:16:22 ] 規格票を持っていたら§14.5.3 Friends を参照してみて欲しい いろいろと制限がきついことがわかると思う
448 名前:428 mailto:sage [2009/08/11(火) 16:45:41 ] >>447 すみません。 一介の趣味プログラマ(職業とは関係ない)でして、 規格票は買ってはおりません。 日本工業標準調査会:データベース-JIS詳細表示 ttp://www.jisc.go.jp/app/pager?id=40240 ここで探してみます。
449 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 17:05:27 ] namespace MyNS { //省略 template<typename int_t> class MyTempl; template <typename hoge_t, typename boke_t> hoge_t foo(const boke_t& arg); template<typename int_t> class MyTempl { public : int_t num; MyTempl(int_t n = 0) : num(n) {} template <typename hoge_t> friend hoge_t foo(const MyTempl<int_t>& arg)//問題の箇所1 { return static_cast<hoge_t>(arg.num.num); } }; }//namespace MyNS
450 名前:449 mailto:sage [2009/08/11(火) 17:06:42 ] Comeau C++でコンパイルOK VC++2008で実行可能 だった。
451 名前:449 mailto:sage [2009/08/11(火) 17:16:19 ] template<typename int_t> class MyTempl; この前方宣言は要らなかった。スマソ。
452 名前:449 mailto:sage [2009/08/11(火) 17:17:00 ] namespace MyNS { //省略 template <typename hoge_t, typename boke_t> hoge_t foo(const boke_t& arg); template<typename int_t> class MyTempl { public : int_t num; MyTempl(int_t n = 0) : num(n) {} template <typename hoge_t> friend hoge_t foo(const MyTempl<int_t>& arg)//問題の箇所1 { return static_cast<hoge_t>(arg.num.num); } }; }//namespace MyNS
453 名前:428 mailto:sage [2009/08/11(火) 17:22:28 ] >>449 さん その方法なら テンプレートかつクラス内定義friend関数に できるのですね。 ありがとうございます。
454 名前:428 mailto:sage [2009/08/11(火) 17:47:41 ] >>449 さんのコードを記しました。 ttp://codepad.org/xotYKfl3 g++ 4.4.0 VC++ 2008 Comeau C++ では通りましたが、 BCC5.5.1 では通りません。 まあどうせBCCが悪いのだろうとは思いますが。 BCC6.1.3をお持ちの方、試していただけませんでしょうか?
455 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 17:49:51 ] struct { ... } var; という感じで名前のないクラス/構造体を作れると思いますが、 これにコンストラクタ/デストラクタを付けたいなら名前を付けるしかないですか。
456 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 17:51:28 ] ということは、 >>446 の言う逃げのコード(>>446 のttp://codepad.org/yBp6Lo3p) はbcc5.5.1ですら通る互換性の高いコードということか。 bcc5.5.1を見捨てるならどうでもいいんだろうけど。
457 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 17:52:29 ] >>455 4章:クラス ttp://www5c.biglobe.ne.jp/~ecb/cpp/04_15.html
458 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 17:56:08 ] >>454 エラー E2015 codepad9.cpp 49: 'MyNS::double foo<double,MyNS::MyTempl<MyNS::MyInt> >(const MyNS::MyTempl<MyNS::MyInt> &) at codepad9.cpp:8' と 'MyNS::double foo<double>(const MyNS::MyTempl<MyNS::MyInt> &)' の区別が曖昧(関数 main() ) と出てしまいます
459 名前:428 mailto:sage [2009/08/11(火) 18:02:27 ] >>458 ありがとうございます。 BCC6.1.3でも無理なようですね。 ・・・ちなみに、 少し改変した ttp://codepad.org/LQvoBRSP g++ 4.4.0 VC++ 2008 Comeau C++ では通りましたが、 BCC5.5.1 では通りません。
460 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 18:10:33 ] >>457 #include <cstdio> class { int foo; public: void func() {printf("Whee!:%d\n", foo);} void set(int v) {foo = v;} } bar; int main() { bar.set(3); bar.func(); return 0; } -- 無事に実行できるけど?
461 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 18:11:59 ] >>460 元質はコンストラクタ/デストラクタが作れるか聞いているのは判る?
462 名前:457 mailto:sage [2009/08/11(火) 18:12:22 ] >>460 正直スマンかった。
463 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 18:17:56 ] >>460 つまり、そのサイトはダメダメということで宜しいか?
464 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 18:34:44 ] >>459 エラー E2015 codepad10.cpp 59: 'MyNS::double foo<double,MyNS::MyTempl<MyNS::MyInt> >(const MyNS::MyTempl<MyNS::MyInt> &) at codepad10.cpp:8' と 'MyNS::double foo<double,MyNS::MyInt>(const MyNS::MyTempl<MyNS::MyInt> &) at codepad10.cpp:38' の区別が曖昧(関数 main() ) となってやはりbcc6.1.3でも無理です
465 名前:428 mailto:sage [2009/08/11(火) 18:45:35 ] >>464 Borlandはこのあたり伝統的に対応がおそいようですね。 ありがとうございます。
466 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 18:50:23 ] template <typename T> bool is_not_zero(const T& arg); テンプレート引数T型はint型からT型へ暗黙のキャストが可能なものを選ぶとするとき、 operator!=(const T&, const T&)が定義されていれば template <typename T> bool is_not_zero(const T& arg) {return arg!=static_cast<T>(0);} とし、定義されていないならoperator==(const T&, const T&)を利用して template <typename T> bool is_not_zero(const T& arg) {return !(arg==static_cast<T>(0));} とする。 こんな方法は可能でしょうか? 可能でしたらご教示ください。
467 名前:デフォルトの名無しさん [2009/08/11(火) 18:56:51 ] 今朝来たMSDNのメールて、 【64 ビット プログラミング ガイド日本語版を公開中!】 次世代 Windows 環境に備えよう なんてのが届いたので、みていたら。 int i1 = -2; unsigned int i2 = 1; char *s = "Hello"; printf("%s", s + 1 + (i1 + i2)); このコードは32ビットなら動くけれども、64bitだと修正しろとあります。 ぱっと見た目変なところはなさそうにみえるのですが・・・ 1.int が 64bit → 問題なし 2.int/unsigend は 32bit で64bit int にキャストされる → 問題なし 3.int + unsigned = unsigned → 0x000000000ffffffffL になるから? なんで long int になんねーんだよwなのだろうか? 64bitもっている人誰かいたら解説ください。
468 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 19:00:50 ] そんな不気味なコード書かないだろうたぶん たしかWindowsはlongも32ビットだから、size_tやptrdiff_tを使わないとだめなんじゃ?
469 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 19:40:33 ] printfの行がキモすぎるwww たぶんポインタまわりのことを言いたいんだと思うが。
470 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 19:41:28 ] windowsはLLP64だから i1 + i2 -> unsigned int (0xffffffffU:32bit) s + 1 -> char* (64bit) s + 1 + (i1 + i2) -> s + 1 + 0x000000000ffffffffULL 何ビットだろうがそんなコード書くな
471 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 21:14:40 ] もっと他のまともな例があった気がする。 どこで見たっけな。
472 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 21:45:42 ] class { class testのメンバ変数hogeを返す場合 以下の定義で何が違うのでしょうか? inline const Hoge getHoge(...) const Hoge & getHoge(...) Hoge getHoge(...)
473 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 21:48:28 ] VC++2005だとこんなコードを32bitでコンパイルしても64bit移植性警告出るね。 char* s="hello"; int a=reinterpret_cast<int>(s);
474 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 21:49:20 ] >>473 ああそれ鬱陶しかったよね。 2008にして良かった。
475 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 22:37:46 ] >>474 鬱陶しいなら警告切ればいいだけだと思うのだけど……。 デフォルトで、2005はオン、2008はオフというだけなのだから。
476 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 23:04:41 ] >>473-474 妥当な警告じゃないの? intptr_t とか、適切なサイズの整数を使えって意味で。
477 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 23:09:42 ] >>476 32bitでコンパイルする場合に出るんだよ。 まあ、10年は32bitの時代だね。
478 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 23:22:17 ] >>444 それはたぶん、暗黙の型変換とごっちゃになってるんじゃ…
479 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 23:33:54 ] >>477 何ビットだろうが、ポインタと int のビット数の大小を決め付けてるのはおかしいってことね。
480 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 23:49:33 ] >>472 inline const Hoge getHoge は、 - 戻ってくるときにHogeのコピーコンストラクタが呼び出される - 戻ってきたHogeの非constメンバ関数は呼べない const Hoge &getHoge は、 - 戻ってくるときにHogeのコピーコンストラクタは呼び出されない - 戻ってきたHogeの非constメンバ関数は呼べない Hoge getHoge は、 - 戻ってくるときにHogeのコピーコンストラクタが呼び出される - 戻ってきたHogeのメンバ関数は全て呼べる
481 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 00:25:09 ] クラスのデストラクタがvirtualではないクラス を継承する安全な方法はないですよね?
482 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 00:28:38 ] boost::shared_ptrを使うと、デストラクタがvirtualじゃなくても適切なデストラクタが呼び出される はず
483 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 00:35:33 ] protected継承にする。
484 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 02:08:51 ] >>457 そのリンク先の > out.num1 = 10; という使い方を初めて知った。これって合法なのかな 無名構造体のメンバを作ってそれ経由しかしたことなかった(>>460 の方法)
485 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 09:39:03 ] >>484 無名クラスはスルーできるみたいよ。 例えばgccだと`int OuterClass::<anonymous class>::num1'と解釈するみたい。 つーか、>460の型名のないクラスは無名クラスとは呼ばないのかな? 言葉の定義は誰か詳しい人よろしく。
486 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 16:53:23 ] `丶´ ̄ ̄ '' ‐- - - - ァ /)ヾ / /ア| ,, -‐ '' / ///)::/\/ /' |∧ヾ `丶 / /,.=゙''"//::_/ ', ミ / / i f ,.r='"-‐'つ/ \ / i ::l / / / _,.-‐'~ :::} f:(_)ヽ .r(_)、l :::l ', こまけぇこたぁいいんだし!! . / ,i ,二ニ⊃..::ノ {O:c::j {::c::::}| :::| ヽ / ノ il゙フ | :/:::{ `ー´.._, 、__ ー ´| :::| ;;\ゞ ,イ「ト、 ,!,!ヽ、|/レ小、. { _ノ ノ :/|/ヾ、l / iトヾヽ_/ィ" ヽ..、_r-ヾ¨ TE_ァ ヾ´V |/
487 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 16:54:16 ] 誤爆した すまん
488 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 16:54:49 ] 池田ァ!!
489 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 17:46:01 ] まさかム板でこまけぇこたあAAしかも池田かよw
490 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 18:04:22 ] そんなやつは絶対プログラミングできないなw
491 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 19:09:52 ] >>487 `丶´ ̄ ̄ '' ‐- - - - ァ /)ヾ / /ア| ,, -‐ '' / ///)::/\/ /' |∧ヾ `丶 / /,.=゙''"//::_/ ', ミ / / i f ,.r='"-‐'つ/ \ / i ::l / / / _,.-‐'~ :::} f:(_)ヽ .r(_)、l :::l ', こまけぇこたぁいいんだし!! . / ,i ,二ニ⊃..::ノ {O:c::j {::c::::}| :::| ヽ / ノ il゙フ | :/:::{ `ー´.._, 、__ ー ´| :::| ;;\ゞ ,イ「ト、 ,!,!ヽ、|/レ小、. { _ノ ノ :/|/ヾ、l / iトヾヽ_/ィ" ヽ..、_r-ヾ¨ TE_ァ ヾ´V |/
492 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 20:16:59 ] C++でシステム毎に定義された円周率の値を求めることは出来ますか? 例えばnumeric_limitsの様な感じで。
493 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 20:25:39 ] >>487 486を除く このスレ書き込み自己申告して下さい。
494 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 20:28:30 ] >>492 #include <cmath> M_PI とか?
495 名前:486 mailto:sage [2009/08/12(水) 20:32:17 ] 誤爆した すまん
496 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 20:41:10 ] 円周率定数は標準にはないので 2*asin(1)でも使うといい
497 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 20:45:24 ] >>496 それって毎回計算されたりするの?
498 名前:492 mailto:sage [2009/08/13(木) 00:24:02 ] ありがとうございます。 両方とも考慮していきます。
499 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 06:37:53 ] x87ならFLDPI命令呼びたいよなー。
500 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 08:42:49 ] #include <stdio.h> int main(void) { double d; __asm { FLDPI FSTP [d] } printf("%16.15f\n", d); return 0; } 3.141592653589793
501 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 09:58:26 ] 2.0*asin(1.0)をFLDPIにしてくれるコンパイラが欲しいゾ
502 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 10:20:24 ] 幾つかpieを計算する関数を試してみた。 処理時間は概ね、acos(-1) > asin(1) * 2 >> atan2(0, -1)になった。
503 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 10:27:25 ] >>502 興味深い結果だ。
504 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 11:27:17 ] 環境を変えたら入れ替わったりするんだろうか? 関数呼び出しのオーバーヘッド分とか 2倍する演算の分とかその辺の差のような気がする。
505 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 11:32:44 ] 調査している人がいてもおかしくない気もするが。 とりあえずdoubleに限るなら #IFDEFでM_PIがあるかどうかで分けるのが正解な気がしますが。
506 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 12:25:19 ] >>502 それって本当に「時間」?
507 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 12:27:49 ] ぐぐると6*asin(0.5)ってのがよく出てくるけどこの方がいいのかな
508 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 12:33:08 ] 結果定数なんだから定数で置き換えてくれればいいのに。 そういうのをコンパイラに伝える機能って新しく追加されたりしないんだっけ? javaだったかな。
509 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 12:34:48 ] constexprっていうまさにそういう機能がC++0xで追加されるよ
510 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 12:35:51 ] thx
511 名前:502 mailto:sage [2009/08/13(木) 12:36:11 ] >>506 はいな、時間だよ。勿論、atan2(0, -1) >>>>> 定数 だろうけれど。 因みに、gccはpow(2, -23)とかは定数にしてくれるけど>502はM_PIにもfldpiにもならなかった。 尤も、fld1も使う場合と使わない場合があるようだけど。
512 名前:466 mailto:sage [2009/08/13(木) 12:51:27 ] 確かに、πを数値計算する場合、 asin(x)のテイラー展開(正確にはマクローリン展開)が一番自然で、 しかも誤差の項にx^nがかかるため asin(1)よりもasin(0.5)の方が圧倒的に収束は速いと考えられますね。 そのため6*asin(0.5)が良いという可能性はありますよね。 ところでどなたか >>466 をお答えいただけませんでしょうか?
513 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 14:18:09 ] Cの関数を使わず直接FPUを叩いてみた 結果は>>502 と同じ というか、ソースを見てもらうとわかるが、acosを求めるのに一番 手間がかかり、次はasinであり、atanはfpatan一発で求まるので 一番簡単なので結果は予測できる kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9897.txt ここにソースを置いておく >>502 と違う結果が出た人がいたら環境を教えて欲しい
514 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 14:23:35 ] C++と関係ない話は他でやれ
515 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 14:25:46 ] 別にこれ位いいだろ >>504 の疑問に答えただけだ
516 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 14:31:29 ] ご教示願います。 詳説C++ではデストラクタは継承されないとあります。 Accelerated C++では仮想デストラクタは継承されるとあります。 非仮想のデストラクタは継承されない。 仮想デストラクタは継承される。 という認識で正しいでしょうか?
517 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 14:33:52 ] So death.
518 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 14:43:20 ] >>516 「継承される」ってどういう状態のこと言ってんの? デストラクタは必ず派生クラスで再定義されるから、普通のメンバ関数や メンバ変数みたいに基底クラスのものがそのまま使われるってことは無いよ。 あ、少なくとも言語仕様上はね。派生側で追加の処理が無ければまったく 同じ関数が走るようにコンパイルされることは考えられる。 でも、これは virtual 付いてようが付いてなかろうが同じ話。
519 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 15:01:08 ] >>512 メンバ関数(演算子)の有無で切り替えたいというのなら、C++はできなかったと思う。 その代わり、関数の有無を継承したクラスで示すタグディスパッチという手法がある。 class EQ_tag{};//==があることを示すタグのクラス class NE_tag{};//!=があることを示すタグのクラス class A :public EQ_tag { public: bool operator==(int val)const{return val==3;}; }; class B :public NE_tag { public: bool operator!=(int val)const{return val!=3;}; }; template<class T>bool _isEQ(const T& s,int val,const EQ_tag&){return s==val;} template<class T>bool _isEQ(const T& s,int val,const NE_tag&){return !(s!=val);} template<class T>bool isEQ(const T& s,int val){return _isEQ(s,val,s);}// この第3引数で切り替える。 int _tmain(int argc, _TCHAR* argv[]) { A a; B b; isEQ(a,3); //==が呼ばれる isEQ(b,3); //!=が呼ばれる return 0; }
520 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 15:06:26 ] >>517 >>518 結局、基底クラスのデストラクタを仮想にしておけば ・派生クラスのデストラクタ ・基底クラスのデストラクタ がこの順番で呼び出されるので納得しました。
521 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 15:08:22 ] >>520 仮想で宣言した場合としていない場合、 どう違うか たぶん理解してないよ、それ。 基底クラスのポインタにキャストしてdeleteした場合について 限定しているわけじゃないでしょ?
522 名前:466 mailto:sage [2009/08/13(木) 15:10:29 ] >>519 タグディスパッチとは、 input_iterator_tag forward_iterator_tag bidirectional_iterator_tag random_access_iterator_tag output_iterator_tag と同じような物でしょうか?
523 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 15:14:36 ] template <class T> class Hoge { T val; //詳細が続く。 } こんなTクラスのラッパクラスであるHogeに対して、 hoge->T方向のキャスト演算子をオーバーロードしたいのですが、 const operator T()const{return val;} operator T(){return val;} のような2通りのバージョンを用意すべきでしょうか? それとも上の1つだけにした方が望ましいですか?
524 名前:523 mailto:sage [2009/08/13(木) 15:16:12 ] 正しくは operator const T &()const{return val;} operator T &(){return val;} かもしれません。 参照をいまいち理解出来ていなくて。。。
525 名前:519 mailto:sage [2009/08/13(木) 15:18:09 ] >>522 うん
526 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 15:21:55 ] 参照でない(コピーを返す)なら、const版だけでいい 参照を返すなら、valを変更されてもよければ2つとも用意する valを変更されたくなければconst版だけ
527 名前:466 mailto:sage [2009/08/13(木) 15:22:22 ] >>525 ありがとうございます。 そのあたり、もっと勉強してきます。
528 名前:523 mailto:sage [2009/08/13(木) 15:27:36 ] >>526 valはHogeのプライベートメンバなのですが、 T型へのキャストでvalを変更可能にするのとしないのと、 クラス設計としてはどちらが望ましいとかはありますか?
529 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 15:32:01 ] そのラッパクラスの目的、どういう利用方法を想定しているかによる
530 名前:デフォルトの名無しさん [2009/08/13(木) 15:41:16 ] なるほど、一概には言えませんということですか。 ありがとうございました。
531 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 16:32:09 ] class hogeのインスタンスメソッドbokeをthreadや、 APIのコールバック設定関数の引数void (*arg)(void)に渡したいんですが、どうすればいいでしょうか? 頼みのboost.bindやfunctionも、boost内部のクラスで定義され、void (*arg)()にキャスト不可能でした
532 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 16:38:01 ] APIのコールバック関数は大抵void*のパラメータを渡せるようになってるはずなので、 それ使ってthisを渡してstatic関数経由で呼べばいいと思います
533 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 16:39:09 ] - -―- 、 /...::::::::::::::.. ヽ / ..:::::::::::::::::::/\ ヽ /..:::/::::/::::// ヽ l:. l. l:::::!::::/●) (●)|:: | . !:::l::::l/// ,, ///l:i:l ェェエエ工工 ヽ:i::!、 r ― ァ ノノ' ` l\`ー './ ノヽ \_フ.ヽ |_ 丶 ヽ . | |' 初心者)
534 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 16:47:14 ] >>521 いえ大丈夫です。 ありがとうございます。
535 名前:531 mailto:sage [2009/08/13(木) 16:47:58 ] >>532 が、できたら苦労はないんですけど、 引数void (*arg)(void)からわかる通り、指定できるコールバック関数の引数が0個なんですよ… なので、クラスメソッド→インスタンスメソッド経由だと、インスタンスのアドレスもわからないですし 複数のインスタンスを扱う事を考えるとグローバル変数も使えずで…途方に暮れてます
536 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 16:58:49 ] じゃあ、適当に10個くらいコールバック関数を用意して、 どのオブジェクトがどのコールバック関数を使用中か管理して、 空いてるコールバック関数を使う 一杯だったらリソース不足ってことにしてあきらめる CPUが決まってるなら、実行時に各オブジェクト用のコードを その場で生成するっていう手もないこともない・・・
537 名前:531 mailto:sage [2009/08/13(木) 17:18:23 ] >>536 そうですね…、やはり管理クラスを別で作るしかなさそうな感じです。 コールバックごときに時間も掛けてられないので、この仕様で行こうと思います。 ありがとうございました。
538 名前:519 mailto:sage [2009/08/13(木) 18:02:35 ] >>535 プライベートなスタティック変数を経由する。
539 名前:デフォルトの名無しさん [2009/08/13(木) 19:07:06 ] 複数のグローバル変数を1つのclassで包めば安全度あがる?
540 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 19:15:11 ] オブジェクトとして扱うなら
541 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 19:15:27 ] あがりません。 グローバル変数のまずい点の一つは 密結合であるということだからです。
542 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 20:47:43 ] 安全度ってものが何を意味するか微妙だけど、 とりあえず何の名前空間にも含まれていないグローバル変数が 複数あるならその段階でコードがクソ設計である可能性は高い。 ・・・って誰もこんな事聞いてないか。
543 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:26:18 ] MapDataというマップダータの変数があるとして マップ描写、当たり判定、キャラなどのクラスからアクセスがあるなら グローバル変数以外にどう実装すればおk? 全部ひとつのクラスで包めばいいかもしれないが それぞれのクラスにMapDataを渡すとなれば引数が多くなりスマートにならないんじゃね
544 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:33:05 ] 今日はじめてC++の文法解説サイトを読みました。 C++というか構造体++に見えてしまうんですが、 オブジェクト指向とか仰々しい名前が付いててこんなもんですか?
545 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:34:28 ] >>544 継承と仮想関数があってもですか?
546 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:39:25 ] オブジェクト指向なんて今時珍しくもなんともないだろ
547 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:39:44 ] テンプレート超楽しい
548 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:41:50 ] >>543 マップデータを内包するMapDataというクラスにマップ描写や当たり判定を行うメンバ関数を用意する。 キャラクラスからのアクセスはどんなものかわからんので知らない。
549 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:43:18 ] オブジェクト指向の入門書はJavaやC#の方が多いくらいだし C++学ぶ段階でオブジェクト指向ってなんですか?って言う人は減ったわな。
550 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:44:26 ] C++特有の物といったら多重継承ぐらいなもんだしな それを使ったオブジェクト指向入門書というのは割と少ない
551 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:48:23 ] 普通はMapDataのインスタンスを受け取ってデータ取得や当り判定、描画を行うクラスを用意する。
552 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:51:41 ] >>545 >継承と仮想関数があってもですか? これから読んできます! クラスの解説読んでるとSQLとRelationalDatabaseで良いじゃん!と思ってしまんですが、 クラスのありがたみってどのあたりで現れてきますか?
553 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:52:58 ] >>552 君はGoF読むか独習デザインパターンC++を読みなさい
554 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:00:40 ] >>543 唯一絶対の正解なんてのはねーが、マップ描写なら ttp://marupeke296.com/OOD_No6_CS2_ShootBullet2.html 描画対象の基底クラスを作ってうにゃむにゃ。 描画対象が抽象化されるからレンダラーで奥行描画の調整もしやすい。 いま漏れが思いつく限りでは一番好きなやり方。 キャラなら適当なクラスを作ってインスタンスをプール。 当たり判定はmapdataのお仕事って感じかな?
555 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:01:05 ] >>552 おいっす、明日ジュンク堂あたりでじっくり読んできます。 とは言うものの、デザインパターンって昔読んでさっぱり分からなかったんですが、 デザインパターンその物の解説本よりも、 デザインパターンを使って作ってみましょう!見たいな本はないですか?
556 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:06:33 ] >>555 推薦図書/必読書のためのスレッド 51 pc12.2ch.net/test/read.cgi/tech/1250040767/ このスレで聞いてみたら? 出来るだけ詳しく「これこれこういう本が欲しいんです」と 自分の意志を伝える事かな それからweb上にも役立つ所がある 俺は www.01-tec.com/document/cpp_design_pattern.html ここを良く読んでるけどな
557 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:11:42 ] >>556 ありがとうございます。 聞いてくる前にまず読んできます。
558 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:12:40 ] クラス解説とSQLがどうしても結びつくのかわからない・・・
559 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:17:25 ] だから初心者なんだろ
560 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:18:22 ] いやー、なんか値の代わりに関数が登録されてるように見えて、 検索して値を取り出すのが、関数の呼び出しに見えてしまったんですが、 SQL勉強しなおしですかね・・・・
561 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:25:12 ] いあいあ、なるほどそういう見方もあるのかと 思ってしまった ありかとう
562 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:31:50 ] オブジェクト指向データベースってあったなぁ…あれどうなったんだろう。
563 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:33:11 ] 構造体+アクセス・セキュリティ強化 → 関数管理ライブラリ? 構造体+データ処理特化 → リレーショナルデータベース? 見たいなあいまいな知識しかもってません(笑) むかーし、Cの構造体でDB組んでて、 DBが大規模化して手に負えなくなって、 構造体に機能追加してったら、 関数ライブラリを管理するのにちょうど良いので その方向に進化させたのがクラスなのかなーとか
564 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:34:32 ] Cで構造体に機能追加って、Cの構造体はメンバ関数持てないでしょ
565 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:37:44 ] >>564 メンバ関数として第一変数を構造体へのポインタにすればいいだけでは?
566 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:38:30 ] Cの構造体に機能追加(メンバ関数を持てる様にした)したのが C++のクラスなのかなーという認識で、 初心者の戯言です。
567 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:39:38 ] >>566 それはカプセル化ね データと手続きを今まで別々に扱っていた不自然さを 統一して解決したわけですよ 仮想関数と継承はまた別
568 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:41:52 ] C++はテンプレートを利用したコンパイル時静的多相解決という とんでもない仕組みも持っているけどね そのおかげでBoostという怪物ライブラリが現れて来た
569 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:46:17 ] >>567 ありがとうございます。 データと手続きは別個の方が自然だと思ってましたorz >>568 奥が深いですね・・・ もう一度解説サイト読み直してきます。 C++でGUIのあるアプリケーションを作ろうとしたら.net?とかいうライブラリを使うんでしょうか。
570 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:47:02 ] >>568 テンプレートメタプログラミングってすげぇよな。 俺できないけど、みんなは出来る物なの? ライブラリ作る職業の人すら出来るのかあやしいんだが。
571 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:47:20 ] コンパル時に結果を演算してしまうというのはものすごい技術だけど、 一方で、エラーメッセージが意味不明だったり、 リアルタイムコンパイルによって実現されているMicroshiftのインテリセンスと相性が悪かったり… VS2010で改善されないかなぁ。
572 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:48:02 ] >>569 データと手続きが別個だとプログラムの規模が上がった時に 一人で扱える限度を超えて手に負えなくなるんですよ .NETはC++/CLIという全く別個の言語ですので混同しないように 他にC#とかVB.NETなどもある
573 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:48:09 ] >>569 自然かどうかはちょっと微妙なところがあるとおもうけど、 自分や他人の作った複数のクラスが うまく組み合わさって動くその様は、まさに壮観。
574 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:50:35 ] 盛り上がっているところ失礼します。 const unsigned int num = 10; と書くと、numはコンパイル時に定数となると聞きました。 const unsigned int hoge = 3 + 4; や const unsigned int piyo = (3 + 4 - 1) * 2 / 3; はコンパイル時に定数になりますか?
575 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 22:51:08 ] なります
576 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:02:04 ] なるかどうかはコンパイラ次第だったりしない? 最適化を禁止してアセンブラコード出させてみるとか。
577 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:05:50 ] >>572 >データと手続きが別個だとプログラムの規模が上がった時に >一人で扱える限度を超えて手に負えなくなるんですよ なるほどー >.NETはC++/CLIという全く別個の言語ですので混同しないように >他にC#とかVB.NETなどもある あさってな質問ですいませんorz GUIのあるアプリケーション作ろうとするなら開発環境のスレに移るべきでしょうか? >>573 >自然かどうかはちょっと微妙なところがあるとおもうけど、 >自分や他人の作った複数のクラスが >うまく組み合わさって動くその様は、まさに壮観。 多人数で大規模なプログラムを作るための工夫の結果がクラスっていう概念なんでしょうか? 呼び出し方は最初に決めるけど、データ構造と処理の仕方は各々見えないところで好き勝手やってOK見たいな。
578 名前:574 mailto:sage [2009/08/13(木) 23:06:11 ] >>575 >>576 ありがとうございます。 const unsigned int num = 10; const unsigned int hoge = 3 + 4; const unsigned int piyo = (3 + 4 - 1) * 2 / 3; char a[10], b[num], c[hoge], d[piyo]; がg++で通ることは確認しました。
579 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:06:44 ] >>554 よく理解できないがすげー参考になったわ
580 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:08:12 ] >>577 GUIの話題ならコンパイラスレに行った方がいいな >呼び出し方は最初に決めるけど、データ構造と処理の仕方は各々見えないところで好き勝手やってOK見たいな。 それは仕様書の話だね OOPとは関係ない
581 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:08:48 ] >>577 >多人数で大規模なプログラムを作るための工夫の結果がクラスっていう概念なんでしょうか? いい表現だね。 まあ工夫の一つってことだけど。 クラスはテンプレートと組み合わせたときもまたすごいことになる。 例えば君が有理数クラスを作ったとして普通に使うとintが分母分子の型になるけど、 誰かが多倍長整数クラスを作ってくれていればそれを使うことで 多倍長桁数で分母分子を管理する有理数クラスが一瞬で出来る。
582 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:12:42 ] そうだなクラスの目玉機能の一つとして演算子の多重定義というのがあるな これをテンプレートと組み合わせるとtraitsになる
583 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:18:08 ] >>580 了解しました。コンパイラスレ探しに行ってきます。 初心者の的はずれな質問に付き合って頂いてありがとうございます。 >>581 難しいですねw 理解するにはまだまだ勉強が必要みたいです。 大は小を兼ねる的な、 基本的な関数を、継承使ってちょっとカスタマイズすることで、 ゼロから書くよりは大幅に工数を削減して欲しい関数を実現する見たいな?
584 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:20:05 ] 大規模開発ではクラスは使わない クラスと言う名の構造体しか使わない
585 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:22:12 ] >>583 実際は仮想関数を使うために仕方なくpublic継承を使うけど できることならコンポジションで対応出来る所はそうしたい 継承は使いすぎるとプログラムの見通しが悪くなるんですよ 実際にプログラム書いてみるとわかるけど それからUML図にも慣れるといいね UML無しにOOPしようとすると頭が爆発します templateは継承とはまた全然別の機能 ジェネリック・プログラミングのための機能でこれがあるために C++は特別な言語になっちゃってます
586 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 23:29:26 ] >>585 ありがとうございます。 実のところ、 UMLライクなお絵かきするとCコードを生成してくれる環境に慣れすぎてて、 裏で何が起きてるのかさっぱ分からないという状況に慌てて、 連休利用してCの文法見直してたらいつの間にかここに辿り着いたといった次第です。 (作って覚えるVC#とかの本でキーボード叩くのえらい難儀しました。) 継承とtemplateの違いがまださっぱりなので、 明日もじっくり解説サイト読んで来ることにします。 レスくれた人ありがとうございます。&おやすみなさいー
587 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 10:50:36 ] 一応Cは理解していると思っているのですが C++を最初から勉強しようとした時、何かオススメの書籍なりサイトはありますか? 猫とかやさしい〜ってのはやめとけみたいな話を「C言語なら俺に聞け」というスレで目にしたもので
588 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 11:03:33 ] >>587 ロベールのC++を読んでおけ 規格書に近い内容まで知りたいなら詳説C++も読め
589 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 11:12:34 ] ロベール=ピエール
590 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 11:26:36 ] >>587 AcceralatedC++一択じゃないか? それはいいけど、折角書籍スレがあるんだから見てきたら?
591 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 11:34:09 ] >>590 C++を「一から」理解したい人に「AcceralatedC++」は 違うだろうと思うんだけど それよりC++ in-depth seriesそのものが違うだろうと思う あれは中級者が上級者に進むためのシリーズだろう
592 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 12:31:06 ] >>587 猫はそこまでは悪くないよ。 ロベールのC++教室 ttp://www7b.biglobe.ne.jp/~robe/cpphtml/index.html ここはお薦め。 ここと猫は併用して学んで欲しい。 入門者ならエクスメディアの『ビジュアルラーニングC++』って本が 個人的なオススメだったけど、会社が倒産した。
593 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 14:09:29 ] Webサイトの方のロベールはだめだ。いろいろ古い。 推奨されないコーディングもある。 本はそういうところ直されてるから、そっちを読んだほうがいい。
594 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 20:27:14 ] gotoって処理自体は軽いでしょうか? gotoを使うと無駄なコンストラクタを一回さけられる状況なんですが。
595 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 20:34:11 ] そのコンストラクタを避けるのは本当に必要なことか? 何か速度的に重要な場面? gotoは、ローカル変数のデストラクタを呼ばなきゃいけなかったり tryブロックの出入りが必要な場合を除けば、軽い
596 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 20:51:40 ] goto使うなんて言ったら最後、 何回レビューして注意書き何箇所に追記せにゃならんか・・・ って状況でもなければ作って走らせて比較してみては?
597 名前:594 mailto:sage [2009/08/14(金) 21:05:25 ] >>595 > そのコンストラクタを避けるのは本当に必要なことか? そのコンストラクタはhoge_t型をテンプレート引数にもつクラステンプレートの ものであるため、hoge_t次第で重さが変わります。 > 何か速度的に重要な場面? 速度はあまり重要ではありません。 >>596 gotoを使ってあると、 「こいつ(の技術や作ったクラステンプレートは)大丈夫か?」 って思われますかね、やっぱ。
598 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 21:10:01 ] 使う理由とドキュメンテーションがしっかりしてればいいんじゃね
599 名前:594 mailto:sage [2009/08/14(金) 21:19:45 ] びびってきたんで止めときます。 こうして一生gotoを使わないまま過ごしそうです。
600 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 21:23:24 ] テンプレートの初心者です。 次のキューを実装するコード kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9901.txt でデータの型についてテンプレート化しようとして kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9902.txt とすると、上記ファイルの末尾にあるようなエラーが発生します。 これは、テンプレート関係の記述をどのようにすればいいのでしょうか。 理由あって、仮想関数を仕様しています。(スタックも実装する予定なのです。) もしよろしければ見てやってください。よろしくお願いいたします。
601 名前:600 mailto:sage [2009/08/14(金) 21:31:02 ] エラーの表示を忘れておりました。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9903.txt なにとぞお願いいたします。
602 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 21:34:57 ] class queue { 〜 } の中に using DataStruct<T>::buff; と書く
603 名前:600 mailto:sage [2009/08/14(金) 21:40:38 ] ありがとうございました。 テンプレートについて詳しく書かれた教科書を探さなければ。
604 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 21:41:26 ] >>597 MISRA-Cなんかだと例外処理の時のみ認められてるかな? gotoその物は悪くないんだ、ただ下手な使い手が多かっただけで、 このあたりはアメリカの銃問題と似たような感じ、 銃が悪いのか銃を使った人間が悪いのか、 銃が悪いのか、子供の手の届くところに銃を放置した親が悪いのか、ってな感じでね。 そのgoto使う箇所ってどのくらいの頻度で呼ばれるの? CPUもメモリも豊かな時代だからよほどのことがない限り使わないけど。
605 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 21:44:41 ] >>597 よく読んでなかったスマソ 実行速度はもちろん、コードの可読性が上がるみたいな理由がなければ、 基本的に使わないのが無難かな、 イスラム教徒とか黒人だってだけで差別されるっしょ? あんな感じよ。
606 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 22:19:34 ] そこまでの差別意識はないけど、ここ十数年gotoは使ったことない。 使う理由が見出せないだけだがな。もしgoto使った人間が近くにいたら、 理由を聞いて見たい、いや問い詰めたい気分がするのは間違いない。
607 名前:597 mailto:sage [2009/08/14(金) 22:48:52 ] >>604 呼ばれる頻度はたいしたこと無いと思います。 >>605 可読性はむしろ下がると思います。 >>606 ですよね、自分も他の人間が使っていたら是非聞いてみたいと思います。 やはり使わないのが無難という感じでしょうか。。。
608 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 22:57:04 ] 俺はそれほど気にしない派 しかし可読性が下がるのは戴けない 速度がよほど気になる場合以外は、可読性を取るべき
609 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 23:02:02 ] 末尾再帰したいけど最適化が保証されないからgoto使ったことあったかも
610 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 00:32:54 ] gotoでコンストラクタが1回避けられる状況ってほうが謎だ・・・
611 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 03:07:19 ] 条件演算子で避けられたりしないか?
612 名前:597 mailto:sage [2009/08/15(土) 08:12:23 ] ありがとうございます。 > gotoでコンストラクタが1回避けられる状況ってほうが謎だ・・・ 既に作ってあるオブジェクトを返せばいいっていう状況です。 ちょっとここのあたり(もしgotoを使ったら)スパゲティプログラムに突入します。 > 条件演算子で避けられたりしないか? さけがたいです。
613 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 09:10:29 ] >>612 ifとauto_ptrで回避できると思うんだがどうよ もっとも、実行速度にあまり影響ないなら分岐を避けたほうがいいかもね
614 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 11:44:18 ] VC++6.0をもってるんだけど、これで勉強すればいいのかなぁ?7.0とかあるの?
615 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 11:48:38 ] VC6は窓から捨てるべき 2008のExpressを使いなさい
616 名前:612 mailto:sage [2009/08/15(土) 12:51:19 ] >>613 newして得たオブジェクトでしたらauto_ptrを使うことも考えますが、そうではないのでこのまま分岐を避けようと思います。 >>614 VC6で勉強するのは、今現在は相当悪い選択肢だと思いますよ。 VC8かgccがオススメです。
617 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 12:56:27 ] >>614 特別な理由がなければ、VC++6.0より下記の製品のどれかの方が断然いいよ。全部タダだし。 Microsoft Visual Studio 2008 Express Edition www.microsoft.com/japan/msdn/vstudio/express/
618 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 13:06:23 ] >>617 dクス
619 名前:デフォルトの名無しさん [2009/08/15(土) 13:15:06 ] VC6は現行の標準C++じゃないと思ったほうがいい。 C++ライクなVC6独自言語だと思いましょう。
620 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 13:40:27 ] >>619 kwsk
621 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 14:02:26 ] コンストラクタで配列の要素数を自動で取得したいのですが... TCHAR a[] = _T("123"); my_array<TCHAR> v = a; 見たいなことをやりたい 理想は、 my_array<TCHAR> v = _T("123"); だけどこっちはまあいいや
622 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 14:42:39 ] my_arrayが何かわからないけどこういうこと? std::basic_string<TCHAR> v = _T("123");
623 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 14:45:04 ] こうですねわかります template<typename T> struct my_array { template<std::size_t L> my_array(T (&a)[L]) { std::cout << "length: " << L << std::endl; } template<std::size_t L> my_array(T const (&a)[L]) { std::cout << "length: " << L << std::endl; } }; int main() { my_array<TCHAR> v = _T("123"); }
624 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 14:48:17 ] 次のコードをコンパイルすると、リンカがエラーを吐きます。 codepad.org/Lrswof7O 何処が悪いのでしょうか?
625 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 14:58:01 ] 変数の実体がない。 myclassスコープ外で int myclass::i=0;
626 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 14:59:28 ] >>622 ごめんクラスを作りたかったんだ >>623 おーすげーまさにそれです C++は奥が深い
627 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 17:24:21 ] >>624 実体を定義しろ。 C++ code - 23 lines - codepad ttp://codepad.org/XPEjNpOy これが正解。
628 名前:624 mailto:sage [2009/08/15(土) 19:38:06 ] >>625 , >>627 ありがとうございます。そういうことなんですね。 これからもちょくちょくこのような初心の質問にあがると思いますが、どうかよろしくお願いいたします。
629 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 08:13:54 ] C++で、 誤差のない小数計算(実数計算)が出来るライブラリは ありませんか? Boostにはなさそうで。
630 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 08:30:11 ] どんな計算をしたいのか?
631 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 08:45:45 ] 三角関数です。 誤差のない小数計算型 x; sin(x)+cos(x) とかです。
632 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 08:48:26 ] その計算結果をどのような形で受け取りたいの?
633 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 08:50:58 ] >>629 有限ビットで誤差が無いなんて可能なんですかね? 僕も知りたいです。
634 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 08:55:51 ] >>633 有理数ならboost::rationalで表現できる。
635 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 09:02:25 ] RealLibでも使えば?
636 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 11:02:56 ] 三角関数は一部の結果を除いて無理数でしょ。
637 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 11:39:52 ] >>635 RealLibは遅延評価で計算してるのかな?
638 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 12:23:49 ] >>634 三角関数といっているではないか。
639 名前:629 mailto:sage [2009/08/16(日) 12:33:08 ] >>632 同じ型の変数で受け取りたいです >>635 ありがとうございます。 スレがあるんですね。 ttp://pc12.2ch.net/test/read.cgi/tech/1248060999/ このスレの>>8 さんの発言 「こんなの使わなくたってVW使えばふんがっふんぐっ」 の、VWって何でしょうか? そういうライブラリがあるのでしょうか?
640 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 12:46:20 ] 710 名前:□7×7=4□□[sage] 投稿日:2009/07/29(水) 19:17:00 ID:X3ZTVshE [タイトル] Cargo Bridge [タイプ] 橋かけ・構造力学パズル [URL] www.limexgames.com/ [感想] bridge builderとかやったことある人ならわかりやすいとおもう。 キャラクタが荷物を押して倉庫まで運ぶために、途中の谷に橋をかけるゲーム。 パーツは4種類あり、足場になるパーツと足場にならず支えにだけなるパーツ、それぞれが木製と鉄製の2種類ずつ。 足場になるものの方が高価で、鉄製の方が高価。はじめは木製の2種類だけが使える。 使用できるパーツは右上の予算範囲内に抑えなければならない。安上がりでできるほど高得点。 橋にかかる負荷が、キャラクタが運ぶ荷物の種類によっても大きく変化したり、片道でいいところと往復するところがあったり、 いろいろ考える要素の多いゲーム。今16面挑戦中。 キャラクタが谷に落ちていくときの声がシュールw こういうゲームがあるんだけど、参考ソースとかってどっかにないかな・・・
641 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 12:50:14 ] linear programmingでwikipedia.enれ
642 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 13:13:29 ] >>641 それは計算機にゲームを解かせる場合の方法論であって、ゲームの作り方の ガイドにはならんだろ。
643 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 13:26:01 ] >>639 最終的に計算結果として数値が欲しいのでは?
644 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 13:27:18 ] >>640 デザインパターンのどれかに当てはまりそうだけどちょっと思いつかないわ。
645 名前:639 [2009/08/16(日) 13:35:21 ] >>643 最終的には文字列表記で計算結果が欲しいです。
646 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 13:38:44 ] >>640 こういうゲーム大好きだw 参考ソースは思い浮かばないけど、 高校物理の力学をシミュレートしてるだけに過ぎないのでは?
647 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:00:32 ] >>646 数理計画法(シンプレックス法)では?
648 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:12:22 ] FEMだろ
649 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:14:17 ] >>648 有限要素法ではないと思う。別に力学的解析が必要なわけではないし。
650 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:20:28 ] >>648 それだ!
651 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:32:00 ] 具体的に何桁の精度が必要なのか明示しないと無理なんじゃない? 浮動小数点とかの概念も知らなさそうだし。
652 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:36:39 ] ∧_∧ / ̄ ̄ ̄ ̄ ̄ ( ‘∀‘)< オマエガナー ( ) \_____ | | | (__)_)
653 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:39:13 ] >>640 コードは知らないが、ニュートン力学で十分シミュレートできるだろうね。 パラメータの調整が面倒だと思うが。 >>647 既に上で言及されている。linear programming = 線形計画法。 シンプレックス方は線形計画法の解き方の一つ。
654 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:48:58 ] 線形計画法は関係ないな
655 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 14:53:36 ] くみ上げるのはユーザーなんだから、 最適解の算出とか不要でしょ
656 名前:642 mailto:sage [2009/08/16(日) 15:22:35 ] だから関係ないって言っているんだが。
657 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 16:32:42 ] >>645 文字列って、数式の文字列?だったらmathmaticaを使えばいいんじゃないかな。
658 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 16:40:48 ] >>657 ライブラリを求めてるんだろ。 お前ライブラリの意味分かってる?
659 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 16:55:36 ] 数式処理ライブラリがあるなら教えて
660 名前:658 mailto:sage [2009/08/16(日) 17:19:14 ] >>659 しらね。 自分で探せよ。
661 名前:639 mailto:sage [2009/08/16(日) 17:30:05 ] >>657 いえ、ただ出力するときに std::cout << static_cast<double>(計算結果) などいうバカなことはしないってことです。 ようするに出力時には精度指定で std::stringもしくはconst char* const型 で結果が得られると良いのですが。
662 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 17:49:04 ] >>691 最終的に有限の精度で返すなら誤差は存在することになりますね。 従って計算は、最終的に必要な精度が得られる有限の精度で(誤差のある)計算をすればよいことになります。
663 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 17:52:37 ] >>662 ttp://gmplib.org でも使っとけ
664 名前:639 mailto:sage [2009/08/16(日) 18:19:31 ] >>662 そうでも無いのです。 例えば sin(acos(-1)) などです。
665 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 18:24:51 ] だから数式処理システム使えよ
666 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 18:36:18 ] >>665 ライブラリが欲しいのです。 数式処理システムだと使い物になりません。 あと、数式には文字式はありません。
667 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 19:37:37 ] >>644 >>646 >>653 dクス あぁ〜作ってみてぇ シンプレックス法か
668 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 19:54:08 ] >>664 結果が0にならないね。有限の精度ならそうなるし、数値演算ではよくある話になる。 その辺はいろいろテクニックを使うんだ。たとえばsqrt(1.0-x*x)を使うとか。 数値演算の誤差について調べたほうがいい。
669 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 20:32:39 ] そんなことは知った上で聞いてると思うが
670 名前:639 mailto:sage [2009/08/16(日) 20:41:50 ] 皆さんありがとうございました 紹介されたRealLibのスレのリンク先などを見て挑戦してみます。
671 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 00:12:10 ] >>666 バックエンドで数式処理システム動かしておいて そいつと通信するライブラリを自作したら? いまいち何がやりたいのか伝わってこないんだけど
672 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 00:13:44 ] >>671 お前は何でそこまでライブラリを嫌うんだ? > バックエンドで数式処理システム動かしておいて > そいつと通信するライブラリを自作したら? まじめに言ってるの? 開発したことある?
673 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 00:32:07 ] 俺ライブラリのブラのあたりが嫌いだわ。 なんかブラブラ揺れてそうで。
674 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 00:35:08 ] >>667 シンプレックス法は関係ないってw
675 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 00:54:25 ] >>672 なぜ俺に食いつく? この件に関しては初カキコなんだが 少し落ち着け
676 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 07:50:28 ] もう本人いねーんじゃね。
677 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 10:40:50 ] int型の変数hogeにビット演算を施したいのですが、 ビット演算は環境依存になってしまったりしますか? 2で除算したりするときはビット演算のが速いのではないかと思いまして。 (それともコンパイラの最適化があれば変わらないのでしょうか。)
678 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 10:44:04 ] >>677 そんな判断ができないくらいなら、素直に2で割っておけ。 速度比較結果自体は最近見掛けたが、結論は出てないと思うぞ。
679 名前:677 mailto:sage [2009/08/17(月) 10:46:58 ] >>678 レスありがとうございます。 ビット演算は実はやったことがないので、 もし速いのならこの機会に勉強してみようかなと思いまして。 でもint型なので負の数が混ざると複雑になりますかね。
680 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 10:52:45 ] 速さについての云々は、 まず実測してみたらってのがいつもの結論じゃね。
681 名前:677 mailto:sage [2009/08/17(月) 10:56:18 ] >>680 やっぱ実測なんでしょうか? まあビット演算は腰が重いので、速さを追求する時までは止めておきます。 ありがとうございました。
682 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 10:58:39 ] VC++2008にて const int b = 2; c = a / b; このソースが sar eax, 1になる件。 素人が思ってる以上にコンパイラはうまいことやってくれるよ。
683 名前:677 mailto:sage [2009/08/17(月) 11:01:26 ] >>682 私よりコンパイラの方が頭が良さそうなので コンパイラの最適化に頼る事とします。
684 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 13:08:46 ] >>682 正確には cdq sub eax,edx sar eax, 1 だな。 でないと負の数で端数を切り下げてしまう。
685 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 13:13:31 ] アセンブラって全然分からないんですが 勉強しなきゃダメですかね。。。
686 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 13:35:35 ] >>685 必要になるまでしなくていいと思うよ。 少なくとも、ビット演算がどうのこうのと言うよりも後でいいし、 そもそも他にやるべきことは幾らでもある。
687 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 13:42:54 ] class base class a : public base class b: public base func(base *pb){ if(typeid(pb) == typeid(a*){ aアクセス用のポインタ作成 }else{ bアクセス用のポインタ作成 } オーライドされたそれぞれの関数にアクセス } ってことがやりたんだけどポインタ作成の部分がわかりません こういう場合って同じ処理をif文の中に2回書かないと出来ないの?
688 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 13:45:39 ] >>687 C++の初歩を勉強してください。 そうすれば、pb->func()で事が足りるかどうか判断できるでしょう。
689 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 13:49:05 ] base の関数をvirtualにしたら出来た
690 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 18:18:00 ] #undefしていようがいまいが 別のソースで同名のマクロがあったらどうしようも無いわけですので、 #undefすることの意義がいまいち分かりません。 #undefは心がけた方が良いのでしょうか?
691 名前:690 mailto:sage [2009/08/18(火) 18:28:15 ] ×別のソースで ○別のヘッダーで
692 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 18:41:04 ] おまえはまだC++でマクロを使いたいのか。
693 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 18:55:01 ] はい。
694 名前:690 mailto:sage [2009/08/18(火) 19:13:22 ] >>692 「マクロって超便利!」 →「inline関数ってすげー! templateもすげー!」 →「やっぱりマクロにしか出来ないこともあるじゃん。両立が大事だよな。」 今の私はこの心境なんです。 例えば似たような演算子を一斉に定義するときなど、 #define MACRO(..., op,...) のようにしてopに演算子を入れたりとか まあ色々使い道はあるじゃないですか。
695 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:16:37 ] それはない。
696 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:18:52 ] ほとんど重複してるけどちょっと違うコードとかマクロ使っちゃうよね
697 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:23:13 ] 確かにね。MFCやATLのメッセージマップなんかはマクロの恩恵なしには実現し得ないしね。 Effective C++でもまだまだ必要な部分もあると認めてはいる。 でもやっぱり危険だから、なるべく使わないに越したことはない。でも使いたい? なら、他人のプログラム領域に踏み込まないように最大限の注意を払うべきだ。 自分の管理していないようなヘッダーに自作ヘボうんこマクロを混入させてしまうようなまねは厳に慎むべきで 自分の書くマクロは1翻訳単位内に限定し、ヘッダに宣言するような真似はやめにして もしヘッダに書くなら必ず末尾で#undefして、あるいはヘッダの冒頭に 「このヘッダファイルは俺専用だからお前のプロジェクトでインクルードするなよ?絶対するなよ?」 と注意書きをしておくべき。 なんだったらヘッダファイル作らないというのも手だ。 俺の書いた関数が使いたい奴は手書きで宣言しろ、と。
698 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:25:14 ] >>696 関数化するか、テンプレートを使うか、データ構造を見直せば、そんな気持ちの悪いことはしなくて済むと思う。
699 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:28:31 ] C++2003でvariadic templateをやろうとしたらプリプロセッサ使ってパラメタ変えながら 再帰#includeとかする必要もありますしね
700 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:50:20 ] 再帰リスト作ればいいじゃん
701 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:51:06 ] 嫌だね
702 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:52:52 ] まともなライブラリ(Boostとか)のコードを お読みになれば、結構使われていることも ご理解いただけると思いますよ。 コンパイラ毎にコードをかえるためとかそれだけのため だけではありません。
703 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 20:00:01 ] 話し中すみません。 boost\date_time\int_adapter.hpp 等で (::std::numeric_limits<int_type>::max)(); と書かれているのですが、これはどうしてこの様な記法になっているのでしょうか?
704 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 20:00:44 ] より高級な機能がないから仕方なく使われてる、って以外に マクロが重要になるケースって何かあるの?
705 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 20:04:07 ] >>704 基本的には「仕方なく」使われていますよね。 仕方なくじゃない使い方としては Boost.Preprocessor に代表されるプリプロセッサメタプログラミングがあるのではないでしょうか?
706 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 20:37:14 ] >>703 Boost本家スレで 773 名前:デフォルトの名無しさん[sage] 投稿日:2009/07/28(火) 20:59:38 BOOST_PREVENT_MACRO_SUBSTITUTION っていうマクロはどういった用途で使う(or使われている)のでしょうか? そもそも定義されている部分すら見つけられません。。。 774 名前:デフォルトの名無しさん[sage] 投稿日:2009/07/28(火) 22:14:07 boost/config/suffix.hpp にあるよ 775 名前:デフォルトの名無しさん[sage] 投稿日:2009/07/28(火) 22:15:44 >>773 prefix.hppで定義されてる 使い方は,たとえば某MSのヘッダファイルのように #define min(a,b) ... #define max(a,b) ... と定義されてあった場合, std::min(lhs, rhs) や std::max(lhs, rhs) や std::numeric::limits<hoge>::max() などの min, max がマクロで置換されてしまうけど, std::min BOOST_PREVENT_MACRO_SUBSTITUTION (lhs, rhs) と呼び出せばこれを防げる. つっても,冗長すぎるから普通は(std::min)(lhs, rhs)ってやるけどNE 776 名前:773 [sage] 投稿日:2009/07/28(火) 22:25:46 ありがとうございます。 理解出来ました! てな会話が行われていたよ。
707 名前:703 mailto:sage [2009/08/18(火) 20:44:37 ] >>706 ありがとうございます。 そうしますと、私がこれから定義するmaxテンプレートなども 全て(max)にした方が望ましいと言うことですよね。 ありがとうございました。
708 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:10:40 ] >>531 www.boostpro.com/vault/index.php?&direction=0&order=&directory=Function%20Objects ここのc_functionってのがおもしろい。 関数オブジェクトを関数へのポインタに変換してしまう代物。 ググれば日本語での解説も少しは見付かると思う。
709 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 20:29:32 ] #include <vecter> とやっているのですがerrorC1083が出てしまいます VC++2008EEを仕様しています。 ちなみに#include <list.とかはエラーを出しません
710 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 20:33:03 ] ごめんなさいvectorでした・・・
711 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 20:35:48 ] (´ー`)
712 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 22:14:51 ] ウヒヒ
713 名前:デフォルトの名無しさん [2009/08/20(木) 00:40:25 ] このスレ過疎ってるな。
714 名前:713 mailto:sage [2009/08/20(木) 00:43:37 ] いや過疎ってなかったか。 見間違えた、
715 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 00:44:10 ] 過疎ってねーだろ
716 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 00:49:12 ] int foo(double val) { if( val == 0.0 /*その他重い判定処理*/ ) assert(false); //処理 } こんな関数があります。 この処理の部分で、valの値によってはfooを再帰呼び出ししたいことがあります。 その場合に単に普通に再帰呼び出しをしてもいいのですが、 再帰呼び出しでは無駄な処理(引数の範囲エラーチェックなど)を飛ばせるように フラグ変数をboolで引数に持たせる事はしても問題ありませんか?
717 名前:716 mailto:sage [2009/08/20(木) 00:51:58 ] つまり int foo(double val, bool recursive_call = false) { if( !recursive_call && val == 0.0 /*その他重い判定処理*/ ) assert(false); //処理 } として、再帰時はfoo(val, true)とすることで無駄な処理を飛ばせるようにするのは 設計上まずいとかありますでしょうか?
718 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 00:58:16 ] liboctaveについて質問なのですが Matrix型などで各要素でlong double型を扱うことはできますか? 標準だとdouble型になってしまうのですが・・・ できればやり方も教えていただけるとうれしいです
719 名前:718 mailto:sage [2009/08/20(木) 01:01:39 ] すいません octaveのスレがあるようなのでそちらで聞くことにします それでは失礼します
720 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 01:10:34 ] >>717 無駄を飛ばすと言って無駄なフラグを足すのがアホっぽい。
721 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 01:15:38 ] int foo(double val) { /*無駄な処理(引数の範囲エラーチェックなど)*/ foo_r(val); } int foo_r(double val) { if( val == 0.0 /*その他重い判定処理*/ ) assert(false); //処理 foo_r(val); }
722 名前:716 mailto:sage [2009/08/20(木) 01:19:16 ] >>720 処理の無駄は実行時間の無駄ですが フラグ引数はコンパイル時間の無駄なわけですので 必ずしもおかしなことでは無いと思っております。 どうすればよろしいでしょうか? >>721 確かに処理を分けるのがよさそうですね。 ありがとうございます。
723 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 01:24:50 ] それ以前に重い処理を再帰すんな 設計を見直せ
724 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 01:27:01 ] >>722 > 処理の無駄は実行時間の無駄ですが > フラグ引数はコンパイル時間の無駄なわけですので 何を根拠にそんなこと言ってんの? 余計な引数があれば実行時間も食うしスタック消費量も増える。
725 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 01:27:45 ] 「増える」は言い過ぎた。 「増えてもおかしくない」だな。
726 名前:722 mailto:sage [2009/08/20(木) 01:56:45 ] >>723 再帰と言えば再帰ですが、最大で2回までの再帰でして これ以上軽量化は厳しい状況です。 >>725 > 処理の無駄は実行時間の無駄ですが > フラグ引数はコンパイル時間の無駄なわけですので は主として困る弊害をあげたものです。 bool引数が一つ増えたところで if( val == 0.0 /*その他重い判定処理*/ ) assert(false); を上回るほど実行時間は食いませんしスタック消費量も増えないと 思うのですが。 というか確定的だと。
727 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 07:50:58 ] >>726 最大2回までの再帰ってのがすでに何かおかしい気がする 関数の役割や関係を見なおしてみたら?
728 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 08:09:32 ] >>726 そんなに判定が重いなら、判定部分とその後の処理部分を別の関数に 分ければいいだろう。 そういう風に分けたら、結局再帰なんて必要なくなると思うが。
729 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 08:30:46 ] >>726 >> 処理の無駄は実行時間の無駄ですが >> フラグ引数はコンパイル時間の無駄なわけですので >は主として困る弊害をあげたものです。 引数にフラグを追加すると、コンパイル時間の無駄が「主として困る弊害」になるの? すごいコンパイラを使ってるんだなぁ。
730 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 09:25:33 ] 本当にその無駄が処理のボトルネックになってるならそういう書き換えをやるのもアリだろうが、 そうでなければ全く意味が無いぞ ちゃんとプロファイルとって調べたか?
731 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 09:29:58 ] compile time debugger compile time profiler
732 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 12:12:13 ] class A{ int a; ... void func(){sizeof(*this);} }; class B : public A{}; Aの仮想関数func()内でsizeof(*this)したところ、サイズは128でした。 ところが、Bのfunc()での実行結果はクラスサイズが176なのに、Aと同じ128という結果でした。 Bのfunc()でも176というサイズを得るにはどのようにすれば良いでしょうか? B側でfunc()を定義し直せば解決するのですが、できればAのfunc()のみをいじって解決したいと思います。 環境はVC++2005です。
733 名前:732 mailto:sage [2009/08/20(木) 12:16:58 ] virtual void func(){sizeof(*this);} でした。すみません。
734 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 12:19:43 ] >>731 TMPやってると欲しかったりする あるのかな
735 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 12:42:32 ] >>732 こんな感じの醜いコードを書くくらいしかできないと思う if (typeid(*this) == typeid(A)) { return sizeof(A); } else if (typeid(*this) == typeid(B)) { return sizeof(B); } else { throw std::runtime_error(); }
736 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 12:44:28 ] >>732 A の側では B の存在すら知らない状態だし、実行時型情報として sizeof を取り出す 標準的な方法も無いので、無理。
737 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 13:01:49 ] こういうのはだめ? クラスBなどAの派生クラスにも、継承元をAからAImplBase<B>へと変更するという修正を加える必要があるけど。 #include <iostream> class A { char a[128]; public: virtual std::size_t this_size() {return sizeof (A);}; }; template<typename T> class AImplBase : public A { public: virtual std::size_t this_size() {return sizeof (T);}; }; class B : public AImplBase<B> { char b[128]; }; int main() { B b; std::cout << b.this_size() << std::endl; }
738 名前:732 mailto:sage [2009/08/20(木) 14:28:26 ] >735-737 回答ありがとうございます。 難しいようですね。勉強になりました。 >737さんの案を元にちょっと考えてみます。
739 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 18:06:11 ] MFC勉強してるんだけど動画の再生ってできるのかな? フレーム取り出して一枚一枚ペイントしてくしかない?
740 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 18:12:59 ] >>739 Yes
741 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 18:13:07 ] >>739 DirectShowで再生するのが一般的かと DirectShowの質問は専用スレがあるからそっちでどうぞ
742 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 19:31:24 ] 動画再生するのが一番の目的じゃなくて 入力動画→処理→出力動画ってのを並べて同時再生とかできれば こんなに変わったんだよって分かりやすいかなと思ったんですよね とりあえずDirectShowについて少し調べてみますありがとうございます
743 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 21:34:53 ] きっと泥沼になる
744 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 21:39:45 ] 処理がリアルタイムじゃないならそんなに難しくないけど・・・
745 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 22:44:36 ] 配置のニュアンスとしては 入力動画1 入力動画2 合成動画 のように表示したいので MFC上で動画表示したいなと思ったのですが無理そうなら画像列で表示しようと思います
746 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 00:17:13 ] クラス設計に関しては割とましになってきたような気がするけど クラス間の連携がどうもうまくいかない・・・ Mediatorとかためして見たんだけど、メディエータのメンバ関数が増えまくってしまう・・・
747 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 07:32:07 ] codepad.org/7lYft1tr bad_weak_ptrが出ちゃう。誰か助けて。 ライブラリ側にBaseクラスがあって、何も変更できない。 やりたいことは、Derivedクラスのメンバ関数のファンクタを作りたい。 (コールバック用のファンクタがほしい) オブジェクトのライフタイムの関係上、 shared_from_this()の代わりにthisを渡したくない。 くそーわけわかめだぜ
748 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 11:00:30 ] >>747 enable_shared_from_this が2つあるからダメなんじゃないの? Base が変更できないなら Derived のほうは enable_shared_from_this つけなくて いいでしょ。
749 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 15:32:03 ] >>747 こうすると、shared_ptrに捕まえられたファンクタがfに代入される。ただ、F()でF()のファンクタを作る意味がないけど。さらにfで保持すると参照カウンタが0にならなくなる。 ファンクタを作りたいなら、mainで bind(&Derived::F,d)とすればすむ筈。 #include <boost/bind.hpp> #include <boost/shared_ptr.hpp> #include <boost/enable_shared_from_this.hpp> #include <boost/function.hpp> typedef boost::function< void () > func_t; class Base { public: void N(){}; }; class Derived :public Base, public boost::enable_shared_from_this< Derived > { public: void F() { f = boost::bind( &Derived::F, this->shared_from_this() ); }; func_t f; }; int main() { boost::shared_ptr< Derived > d( new Derived ); d->F(); func_t x=boost::bind(&Derived::F,d); return 0; }
750 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 20:11:27 ] >>748 >>749 レスさんすこ。 単純に、enable_shared_(ryだと、 BaseクラスにFメンバ関数がないから、コンパイルが通らないから、 Derivedでも継承させた。 今ぶち当たってる問題を単純なコードに落としただけだから、意味は考えないでくだしあw >さらにfで保持すると参照カウンタが0にならなくなる。 メンバに自分自身を持たせるとダメなの? よくわからん。確かにdtorが走ってなかった・・・
751 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 21:00:57 ] >>747 Baseのenable_sahred_from_thisを活用する、つまりダウンキャストはだめ? class Derived : public Base { public: void F() { f = boost::bind( invoke_f, shared_from_this() ); }; static void invoke_f(boost::shared_ptr<Base> b) { boost::shared_polymorphic_downcast<Derived>(b)->F(); } func_t f; }; invoke_fはlambdaやbindで実装できるなら不要。 Baseに仮想関数がないなら、shared_polymorphic_downcastの代わりにshared_static_castを使えばいい。 あと、お前の例でも通用するか分からないが、安直にweak_ptrを使えば当然デストラクタも呼ばれるようになる。 void F() { boost::weak_ptr<Base> wp = shared_from_this(); f = boost::bind( invoke_f, wp ); }; static void invoke_f(boost::weak_ptr<Base> b) { if (boost::shared_ptr<Base> sp = b.lock()) { boost::shared_static_cast<Derived>(sp)->F(); } }
752 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 21:40:42 ] >>750 fがDerivedをつかんでいる限りDerivedは開放されない。fがDeriviedを放すのはDerivedが開放されるときだから。 DerivedでFのファンクタを保持する必要性はほとんど無いと思われるので、その辺を検討しよう。
753 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 23:51:26 ] 質問があるのですが、 以下のソースのように、例外をいっさい投げれない関数内で例外を投げる処理を書いていまして、 プログラムが異常終了するのを期待しているのですが、VC++2008のコンパイラだと例外をキャッチしてしまいます。 これって理由ありますでしょうか? ちなみに他のコンパイラ(bcc32, g++)では期待通りに異常終了します。 #include <iostream> using namespace std; void test() throw() { throw 0; } int main() { try { test(); } catch(...) { cout << "test\n"; } return 0; }
754 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 01:11:25 ] >>753 VC++の仕様。VC++は基本的に例外指定を無視する。 throw()も最適化のヒントになるだけ。 msdn.microsoft.com/en-us/library/wfa0edys.aspx
755 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 02:01:59 ] C++ Coding Standards 第75項によると 「強制されない限り、自分の関数に例外仕様を書かないこと」と書いてありまっする。
756 名前:753 mailto:sage [2009/08/22(土) 06:07:01 ] >>754 , 755 どうもありがとうございました! すっきりしました。
757 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 12:00:03 ] >>753 以前vc9(betaだったかも)でいろいろ試したときは throw()つきの関数内で例外を投げるコードをreleaseビルドしたバイナリを実行したときは異常終了したと思う 嘘だったらごめん
758 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 14:09:05 ] >>755 その理由は? その関数が投げる例外が正体不明になったら普通困らないかな?
759 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 14:48:54 ] >>758 まずコストとして、 try-catchブロックが挿入される でそれが最適化の妨害をする 違反した際はunexpected_handlerに飛ぶだけになって、 指定しなかった場合において得られる可能性のある例外の情報は失われる 得られるものは動的なチェックだけ、 それも例外仕様に違反したら精々「違反した」だけ言って落ちるだけの貧相なもの 備考として、 テンプレートが関わるとどんな例外が来るかは定義時点では決定不能なので 適切な例外のリストを作ることは無理 こういう性質のもので関数が投げる例外が明確になる? 使う価値あると思う?
760 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 15:29:34 ] それってthrow()も駄目なのか? まぁ別に大抵は書く必要も無いけどなthrow()なんて
761 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 15:59:06 ] throw()だけは価値がある場合もあるかもしれない、俺は書かないけどね と書いてある
762 名前:753 mailto:sage [2009/08/22(土) 16:17:01 ] >>757 IDEを起動してreleaseで実行したところ異常終了しました。 違いがよく分かりませんが、debugにすると例外をキャッチしました。
763 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 16:52:10 ] デフォルトだと例外仕様違反するとunexpected()->terminate()->abort()が呼ばれることになってるから 異常終了するのが正常
764 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 18:15:05 ] throw(hoge)って書いても関数仕様変更すると広域に波及して変更が大変。労力に見合ったメリットってない気がする。 ただthrow()は例外安全を示すメリットはあると思う。 そういえばデストラクタにthrow()はなんで書かないんだろうか?
765 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 18:29:39 ] アホなコンパイラがtryブロック挿入する可能性があるから
766 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 19:09:44 ] 例外投げない保証は有用なのにthrow()がクソすぎるから C++0xでnoexceptというのを型システムに組み込もうぜという話がある
767 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 19:15:56 ] allocator とか auto_ptr とか vector<bool> とか どんどんゴミがたまっていきますね^^
768 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 19:54:45 ] おまえallocatorとauto_ptrなめんなよ
769 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:07:24 ] まあauto_ptrはunique_ptrに移行してdeprecatedの予定ですけどね
770 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:12:35 ] だがゴミではない。現行の規格では重要なものだ。
771 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:22:29 ] 同情の余地がないvector<bool>さんパネェ
772 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:32:02 ] おまえら予約語なのにスルーされてるexportさんに謝れ
773 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:35:31 ] export は普通に関数名とかに使いたいときがあって困るな。 キーワードは変に短縮されてるほうがいいんじゃないかとすら思うよ。 int とか const とか、まず自分で使う気にはならん。
774 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:38:16 ] まともな実装がないexportを何故標準に入れたのか 標準化委員会は狂っているとしか思えない
775 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:39:05 ] Comeauなめんな
776 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 22:00:12 ] >>747 コールバックのための関数オブジェクトはこれ Derived オブジェクトの外に配るんですよね? コールバックのための関数オブジェクトをメンバとして保持せずに 外に配るときに毎回作る + shared_ptr<Base> を downcast したものを持たせる, で良いのでは?
777 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 23:56:22 ] >>774 >435-436 時々で良いから、Comeauの事を思い出してあげて下さい
778 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 00:15:02 ] >>766 確かに、constメンバ関数と同じように例外安全性の指定ができればいいなーと思ったことはある C++ Sourceにテンプレートを使って実現する技法が投稿されてたけど、 あれを実践するのは正直ムリだと思った
779 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 00:34:50 ] export の実装ってそんなに難しいかなあ。 オブジェクトファイルにソースコード埋め込んで、リンカからコンパイラ呼べば 済むと思うんだけど。
780 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 00:37:50 ] >>779 よく分からんがそのお前の案とやらで gccでexportが実装できたら このスレの神プログラマとして あがめられるな。 すくなくともテンプレには確実に入る。
781 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 01:14:34 ] Comeauが3人年かけてexport実装して「もうやだ実装したくない」って禿に泣きついた話が D&Eに載ってるから読むがいい
782 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 02:07:50 ] その話に関してはどちらかというと Exceptional C++ Style を紹介したほうが良いような?
783 名前:デフォルトの名無しさん [2009/08/23(日) 03:08:52 ] boost::functionの型引数について教えてください。 boost::function<int (int)>と宣言したときに、 どうやってシグネチャから戻り値の型と引数の型を取り出しているのでしょうか?
784 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 03:11:35 ] template<typename T> class function<T()>{/******/}; template<typename T, typename U> class function<T(U)>{/******/}; template<typename T, typename U, typename V> class function<T(U,V)>{/******/}; ; とかやってんじゃないの 知らないけど
785 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 03:38:58 ] 全力でソース追いかければ何とかなるんじゃね、知らんけど
786 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 07:35:23 ] プログラミングエキスパートの皆さんの力が必要です。 どうかどうかツールを作っていただけないでしょうか。 もはや風前の灯状態のスレを救ってやってください。 yahooきっずで先生1位にして教育委員泣かそうぜwww yutori7.2ch.net/test/read.cgi/news4vip/1250954051/
787 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 07:37:58 ] H S P で や れ
788 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 07:41:18 ] 本気で宣伝するならまとめページ作ってそこのリンク張るようにしてくれ vipのスレのリンクなんか張ってもすぐdat落ちして見れなくなってしまうじゃないか 本当に見る人のこと考えてないんだな
789 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 11:33:48 ] なんでさりげなく適切なアドバイスしてんだよw >>783 >>784 をプリプロセッサで展開
790 名前:デフォルトの名無しさん [2009/08/23(日) 11:49:15 ] valarray<T>::apply(T func(T))が,ふつうの関数しか受け付けないのですが, 関数オブジェクトを関数へのポインタに変換する関数って標準で用意されていますか? つまりptr_funの逆関数はあるでしょうか?という質問です. (自分で書けば一行ですが,メソッドが増えるのはよくないでしょう) 唐突ですが,よろしくお願いします.
791 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 13:25:24 ] 関数オブジェクトは関数の形をしてはいるものの、 それ自身のアドレスは持ってないから逆関数なんてないよ
792 名前:デフォルトの名無しさん [2009/08/23(日) 14:06:41 ] なるほど.わかりやすい説明ありがとうございます.
793 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 15:47:50 ] あれ、なんか調子悪い?
794 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 15:55:34 ] c_functionとかいうのがあるんじゃなかったっけ 使ったことないけど
795 名前:デフォルトの名無しさん [2009/08/23(日) 16:17:05 ] なるほど.これですね. ttp://d.hatena.ne.jp/faith_and_brave/20090107/1231316933 まさに探していたものです.ありがとうございます! が,Boostがないところで困りそうなのでやめときます. valarray<T>もSTLライクな実装を加えてくれたらいいんだけど, たぶん遅くなるのがイヤなんでしょうね.
796 名前:デフォルトの名無しさん [2009/08/23(日) 16:22:50 ] うわっ.っていうかBoost VaultはBoostですらないんですね. みなさん,ありがとうございました.
797 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 17:41:03 ] >>796 Boost File Vault Boostライブラリには入っていないけれど、その叩き台としたい、 というようなソースが転がっています。宝の山。^^ ってk.inaba氏が言ってた。
798 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 18:39:58 ] valarrayを捨てる手もありそうだが
799 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 19:07:21 ] >>790 valarray<T> y = x.apply(functor);としたいとして、 代わりにこれで我慢するのはだめ? valarray<T> y(x.size()); std::transform(&x[0], &x[0] + x.size(), &y[0], functor); valarrayも要素が連続している保証があるからこんなことして平気なはず。
800 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 20:45:54 ] void関数ではその処理を終えて外のスコープに処理を戻したい場合は return; を記述しても良いということでしたが、 コンストラクタでも同様にreturn;を記述しても 良いのでしょうか? 記述した際にはそれより後ろにある処理は実行されないと期待してよろしいですか? g++ではこの通りの動作でしたが、これがC++の仕様なのでしょうか。
801 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 22:20:28 ] >800 大丈夫です. 蛇足ながら対応するであろう規格の文言は (6.6.3/2), (12.1/12)
802 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 23:33:21 ] 795があぼんなんだがまたfaith and braveでも貼ったのか? いい加減にしろ。
803 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 02:10:07 ] あぼんしてるなら触れるなよ アホなのか?
804 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 04:28:47 ] 何のためのあぼーんなんだよなw
805 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 06:56:27 ] 何でFaith and Braveを貼っちゃいけないんですか?
806 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 06:59:04 ] あぼーんであれスルーであれ、「お前の言葉は俺に効いてない」とアピールしたいあまり、 それを自分から言い出して、効いてるのがバレバレになる奴はたまに見かける。 たぶん居留守を使う時なんかも、居ないとアピールしたい一心で ドアの向こうの人に「いま居ません」とか言っちゃうんだろう。
807 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 07:03:18 ] 「レス番飛んでるんだけど、何きたの? ねぇ、何きたの?」 「お前、NGに入れたから」 「あ、そう。でさぁ(ry」 「NGに入れたっつってんだろぉぉぉぉぉ!」
808 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 07:21:54 ] 言葉にしない間しか成立しない主張を、言葉にすることで殺しちゃうんだよな。 「誰もお前にレスする奴なんかいねえよ」とか。 自分の言葉で直接相手を悔しがらせたい衝動、みたいなもんが低脳にはあって、 それに勝てずに自爆してしまうんだろうか。
809 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 10:43:00 ] あ…あんたのことなんて、何とも思ってないんだからねっ! ってパターンも。
810 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 12:23:02 ] あるあるwww
811 名前:デフォルトの名無しさん [2009/08/24(月) 17:06:45 ] すみません.レス遅れました. >>797 自分で適当にソースを改竄すればいいってことですね. >>798 valarray<bool> って嬉しくないですか? (vector<bool>のかわりに・・・) >>799 コピーコストに目をつぶって,これでいこうと思います. >>802-6 まったく議論が理解できないのですが,気分を害したのならすみません. c_function って検索してもあまり出てこなかったので便利かと思って リンク貼りました.他意はありません. 正直,あまり回答には期待していなかったのですが, 色々アイディアをもらえて感激しています.ありがとうございました.
812 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:22:59 ] > 正直,あまり回答には期待していなかったのですが, > 色々アイディアをもらえて感激しています.ありがとうございました. この一言はどうして書いちゃったんだ。 「お前らには大して期待してなかったけど いないよりは役に立ったな」 って意味にしかとれないんだけど。 実生活でこれいったらもう目も当てられない ようなことになるぞ。
813 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:24:35 ] それはお前の読解力がおかしいんじゃないのか
814 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:27:44 ] >>813 いやおかしくないだろ。 別に悪意を持って読んだわけじゃないけど、 そう思った人は俺以外にもいるだろ。
815 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:35:51 ] >>813 お前の読解力だと > あまり回答には期待していなかった これは「誰の回答に期待してなかった」んだと思う?
816 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:44:25 ] 書き方が悪いのは確かだな。 あまり反応してもらえるとは思わなかったが、と書くべき所。
817 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:48:21 ] > あまり回答が付くことは期待していなかった ならいいけど、 > あまり回答には期待していなかった=ろくな回答は無いと思っていた と取られるとね。 まあ2chだから当然な予測かもしれないけど、 わざわざ書かなくても良かったかもね。 でもそこは噛みつく程でもない気がするが。
818 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 22:37:42 ] むしろ>>812 みたいなことをいちいち言っちゃう人のほうが 実社会では目も当てられない。 最近キレる人が増えたのは、 無礼な人が増えたよりも 他人の無礼をまったく許容できない赤ん坊のような糞人間が増えたからだって どっかの新聞に書かれてたなぁ。
819 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 00:07:27 ] で?
820 名前:デフォルトの名無しさん [2009/08/25(火) 01:29:40 ] 平謝りです.ごめんなさい. > 実生活でこれいったらもう目も当てられない この通りですね,弁解の余地はありません. 人によって2ちゃんねるとの付き合い方は違うのに, それを無視した迂闊な発言でした. 感謝を伝えたかったのに・・・(涙)
821 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 01:56:50 ] >人によって2ちゃんねるとの付き合い方は違うのに, >それを無視した迂闊な発言でした. 別にダメじゃないが何というか、一言多いよね。 再帰的に迂闊。
822 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 02:27:13 ] 再帰的わろたうぇw
823 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 03:22:47 ] 要するに、回答内容に期待してなかったんじゃなくて、回答されることを期待して なかったんだろ?
824 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 07:31:11 ] >>821 そこ、俺も同じこと思った。 「俺の2chとの付き合い方を、迂闊どころか当然の顔をして無視し、踏みにじるお前ら」 って言いたいのかなと。 ある要素xを、自分より相手のほうがより強く持っていると判断した時に、 「xを持つことは悪いこと」という概念を大仰に押し立てて「xを持っててすみません」と平身低頭、 実はそういう皮肉攻撃、っていうデザインパターン。
825 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 08:01:05 ] べつにいいんじゃね
826 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 08:23:48 ] ぶっちゃけ何をそこまで絡んでるのか分からん
827 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 08:55:56 ] 世の中うぜえ奴ばっか
828 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 08:57:50 ] ケンカ売る気なら最初から本気でかかってこいや この偽善者め とまあ、そんなことではないかと
829 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 10:43:38 ] 普通の #ifndef HOGE #define HOGE 本文 #endif というインクルードガードがあるにも関わらず、 同時に 「コンパイラの種類がVCであるか、 もしそうならVCのバージョンを調べて #pragma once」 としているものがあるのですが これは意味があるのでしょうか? どうして前者のインクルードガードだけでは不足なのでしょうか?
830 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 10:59:10 ] >>829 微妙。 pc12.2ch.net/test/read.cgi/tech/1186262298/316 316 :306:2009/02/14(土) 04:46:01 >>313 マクロによるインクルードガードでは2回目もファイルを開いて少なくともインクルードガードを 読む必要がある。 #pragma once なら2回目以降ファイルを開かずにスキップするような実装が 考えられる。 そのため、インクルードガードを置いて移植性を持たせつつ、特定のコンパイラでの コンパイル時間を短縮する目的で #pragma once を置くことが考えられる。 en.wikipedia.org/wiki/Pragma_once
831 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:04:55 ] >>830 なるほど、 昔の冗長インクルードガードと同じですか。 ありがとうございます。
832 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:19:17 ] 尚、pragma onceの使える環境であればインクルードガードを省略できると言う考えは間違いである。
833 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:28:03 ] え? #pragma once を使える環境でインクルードガード書かないと何かマズイの?
834 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:31:28 ] シンボリックリンクとかの関係でファイルの同一性がどうのこうのって問題?
835 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:35:23 ] そりゃ昔のバギーな実装の問題だろ。
836 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:58:05 ] 滅多なことでは問題にならんからなぁ。 gcc3.4で解決されたって話もあるし。 それにVCとgccとで使えるから、ふつーのひとはもう何も考えずに#pragma onceしちゃっていいんじゃないかなぁ。
837 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 12:32:29 ] 同じ内容の別のファイルをインクルードするときにバッティングが発生するのを防止することができない。 インクルードガードなら、それができる。その点を無視していいのなら、prgama onceで充分。
838 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 12:48:41 ] #pragma onceの問題点は非標準であるという一点に尽きる。 一々各コンパイラが対応しているかを調べるのは面倒。 ちなみに、上で#pragma onceの時のみに最適化される可能性があると書いてあるが GCCではインクルードガードを使った場合に同様の最適化が効く。
839 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 14:43:19 ] VC++2005なんだがDLLを配布したいんだけど libとh同封しとけばVC6とかVC++2008とかの人でも使えるんかな?
840 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 14:52:59 ] VC8で#pragma onceの効果があるかどうか調べたけど効果はあったよ
841 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 17:14:58 ] 毎回インクルードガード書くより#pragma onceに対応してるか調べた方が結局楽、と いう考えもある インクルードガードなら枯れてるから安心して使える、という考えもある インクルードガードは記述時にヒューマンエラーが起きやすいから嫌だ、という考えも ある #pragma onceはコードではなくファイルに依存するので、シンボリックリンクなどで 別のパスからインクルードされた時の問題などがあって嫌だ、という考えもある まぁ色々それぞれだな #pragma onceにユニークな識別名を付けられるようなのが最初からあれば最強だった んだろうが ちなみに#pragma onceは対応している処理系は結構多い
842 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 17:31:40 ] 出来るだけ多くの環境でも使えるようにしたいもののヘッダは インクルードガードをかけるしかない。 たとえ#pragma once の利点を十分承知し、対応する処理系が増えているとしても。 そして、その利点を生かすためには、#ifdefで切り分けて#pragma onceも併用するという 一見アホらしいコードを書くしかない。 例えば、MSのWin32処理系では、全て#pragma onceが使用可能だが PSDK等のヘッダファイルは、他の処理系でも利用可能にするために インクルードガードも併用されている。
843 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 18:18:21 ] 仮にビルドが通らない処理系があったとして、 それがpragma onceのせいってのは、ありえないと思うけどな。 それ以前のクリティカルな要因で止まるだろ常考。
844 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:10:39 ] インクルードガードと#pragma onceが両方とも有効な状態って問題ある?
845 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:26:39 ] インクルードガードはインクルードを読み込む順番が固定できるから、循環参照を防げるメリットがあるね。
846 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:27:08 ] インクルードガードを矛、#pragma onceを盾だとして、 両方有効な状態だと、両手が砕けて紫龍が負ける そんぐらいです。
847 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:31:11 ] 別に両方書いても、片方が仕事してもう片方が潰されるだけのこと ライブラリ屋は「VC++なら#pragma onceが先に掛かるようにした方が軽いな」とか 有効な順番を意識するが、別にしなくてもコンパイルが僅かに遅いとかその程度
848 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:35:54 ] >>844 問題ない。実際Boostの一部のヘッダではVCの場合に併用している。 >>842 によるとWin32 APIのヘッダでも同様のことをやってるようだし。
849 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:42:13 ] 仕様として #include と書けば何度でもファイルを開いて展開するんだろうけど その仕様が役に立つことってあるの?
850 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:50:48 ] >>849 assert.h を #define NDEBUG して #include したり #under NDEBUG して #include したり。
851 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:51:29 ] Boost.Preprocessorを使った再帰#includeでVariadic Template みたいなことをするテクニックとか…
852 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:01:04 ] #ifndef HOGE_H #define HOGE_H #if defined(_MSC_VER) && defined(__GNUC__) && ... #pragma once #endif 本文 #endif 結局こうするのがベストなのか めんどくせーな
853 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:04:36 ] >>852 それじゃどんなコンパイラでも#pragma onceが使われないぞw
854 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:17:23 ] いや、 VC++でコンパイルする時に -D__GNUC__ -D__BORLANDC__ をオプションにつける GCCでコンパイルする時に -D_MSC_VER -D__BORLANDC__ をオプションにつける という技を駆使しろ、という>>852 のお告げ。
855 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:30:44 ] >>852 #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif これだけでいい。併用は単にコンパイル時間の高速化の意味しか無いから、違いの出る VC++だけ書けば十分。 >>853 この書き方でちゃんと使われる。 ちなみに>>847 は半分間違い。>>852 で両方とも有効に働く。
856 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:31:13 ] 凄いな神の技だ・・
857 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:38:44 ] >>855 > この書き方でちゃんと使われる。 アホ? &&の意味も分からないのか?
858 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 00:43:12 ] >>855 使われねぇよw
859 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 05:24:50 ] >>855 #pragma once は、VC++4.2(_MSC_VER=1020)からサポートされたと考えていい?
860 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 05:47:27 ] 1000にしてるライブラリもある 1020にしてるライブラリもある
861 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 21:36:23 ] STL でつまづいています。 codepad.org/KNe3UsXV lst1.merge(lst2) でマージだけでなくソートされてしまうのはどうしてでしょうか?
862 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 21:41:10 ] なぜならmergeというのはマージソートでいうところのマージを行う関数だからです
863 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 22:12:32 ] こじつけ気味に言うとjoinでなくmergeだから。プログラム関連ではだいたい以下のニュアンス。 join:二つのものをつなげて一つにする。繋ぎ目で切り離せば元の二つに戻る。 merge:二つのものを混ぜて一つにする。元の二つに戻すには構成要素を一つずつより分ける必要がある。
864 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 23:01:23 ] >>861 しっかりドキュメント読め。 lst1.merge(lst2)はソートする。O(n) lst1.splice(lst2)はソートしない。O(1) >>863 も書いているけど、mergeはどちらかと言うと順序関係を保存して結合する という意味合いが強いね。順序関係を作るためにソートが必要になるということ だと思う。