1 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 09:10:30 ] エスケープシーケンスやWin32APIなどの環境依存な物でもOK。 ただしその場合、質問者は必ず、環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.39【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1182740506/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
755 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:21:35 ] とりあえず、boostをベースに、iostreamをstdioにしてみた。 コンパイラはVC2005。対象は、SANSHIRO.txtを20回繰り返した7MBのテキスト 測定は面倒だったから、cygwinのbashのtimeで。 boost$ time ./boost ../input/20.txt real 0m9.324s user 0m0.031s sys 0m0.015s stdio$ time ./boost ../input/20.txt real 0m7.356s user 0m0.031s sys 0m0.015s
756 名前:710 mailto:sage [2007/08/03(金) 00:24:26 ] >>755 stdio版も意外に遅いですね。 time cygstart aozora.js ../input/20.txt の結果はどうでしょうか? (jsがwshext.dllに関連付けられているかどうか分かりませんが)
757 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:30:29 ] 710死ね
758 名前:673 mailto:sage [2007/08/03(金) 00:56:35 ] どうやらBOOST_TYPEOFというのがあるらしいですね VCのバグを使ってほぼ完全にGCCのtypeofをエミュレートできるようです (しかし本当にtypeofという名前だったとは…^^;) 早速使って見ましたが意図したとおりに動いていい感じ range_XXXとかのメタ関数やsmart_ptr,optionalのようなテンプレートと相性がよいようで、 変数から型の参照が文法の上で自在に行えるのは気持ち良いです >>690 検索かけてみましたが0xではその名前になるようですね Visual C++0x(仮)を楽しみに待ちます
759 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:00:35 ] bash-3.1$ perl -v This is perl, v5.8.8 built for MSWin32-x86-multi-thread Binary build 820 [274739] provided by ActiveState www.ActiveState.com (ry bash-3.1$ time perl aozora.pl ../input/20.txt real 0m7.738s user 0m0.015s sys 0m0.031s bash-3.1$ time cscript aozora.js ../input/20.txt Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. real 0m7.637s user 0m0.015s sys 0m0.031s
760 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:00:43 ] decltype という名前にしたのは、 動的な型は得られないということを分かりやすくしたのかね。
761 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:14:35 ] ちなみに、当方ではどうやってもcscriptかwscriptが起動し、 (aozora.jsへの20.txtのD&Dでも)wshext.dllはどうやれば 使えるのかは判らずじまい
762 名前:710 mailto:sage [2007/08/03(金) 01:16:13 ] >>759 わざわざ有難うございます。 JScriptは、cscript.exeやwscript.exeに実行させると私のところでも遅いです。 もしWindowsのレジストリ上でjsがwshext.dllに関連付けられている場合は、 >>756 で書いたようにcygstartでaozora.jsを実行してみてください。 私のところでは、詐欺のような速さになっていました。 ともあれ、stdio版なら、PerlやJScriptよりはどうにか速くなる といったところでしょうか。
763 名前:710 mailto:sage [2007/08/03(金) 01:19:46 ] >>761 レスを読んでいませんでした。 自分も特別に何かしたわけではないので、分からない……
764 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:23:06 ] wshext.dllって、実行がexplorerのスレッド内だったりして、 計測できるのはIPC(ファイルをexplorerに渡す)部分だけ、 みたいなオチはないよね?
765 名前:710 mailto:sage [2007/08/03(金) 01:27:50 ] >>764 ……んー。よく考えると、それ以前の問題として、cygstartで起動すると、 すぐに呼び出し側に制御が戻ってきてしまうので、timeで計測ができるはずは ないですね。 失礼しましたm(_ _)m
766 名前:710 mailto:sage [2007/08/03(金) 01:49:44 ] wshext.dllがバカみたいに速いらしいぞ、と勘違いする人がいるかもしれないので 念のため書いておきますが、全くのデタラメでした。 自分も>>755 さんと同じように、cygwinのbashのtimeでいい加減に計測していたのです。 jsだけは関連付けで起動させるために、cygstartで実行させていました。 cygstartで走らせたものの実行時間を計れるわけがないのに。大ボケです。 とりあえず、iostreamさえ捨てればC++でスクリプトに勝てると分かりました。 が、コードを書くのが格段に面倒くさいのに、大して差があるわけでもないのが 悩ましいですね。 自分でもっとずっと複雑な計算をするプログラムなら、当然比較にならない ほどC/C++が優位でしょうけれども。
767 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:56:15 ] cygwin の GCC って遅かった気がする。 MinGW の方がいい。
768 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:56:45 ] 勘違いするのはお前くらい
769 名前:710 mailto:sage [2007/08/03(金) 02:09:08 ] >>767 C++のプログラムは全てVC++7.1でコンパイルしました。 cygwinのnewlibは、ロケール周りの実装があまりにショボいので、実質的に ワイド文字の処理には使えないと思います。 (VC++にしても、いくつも地雷を踏みましたが。boostも、boost::regexは バグがあってダメでした) >>768 そうですね><
770 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:12:39 ] ><
771 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:13:30 ] xlocaleをちょっと弄ったらboost::regexも落ちないようになるらしいけど詳細は忘れた
772 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:18:51 ] そうですね><
773 名前:710 mailto:sage [2007/08/03(金) 02:22:31 ] >>771 xlocaleてことは、boost::regexのバグではなくVC++のバグってことですかね。
774 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:31:15 ] 勘違いするのはお前くらい
775 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:31:50 ] ライブラリのバグかコンパイラのバグか知らんけど 動くコンパイラはあるわけだからね
776 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:38:02 ] このスレの>>622 に解決法あるじゃん
777 名前:710 mailto:sage [2007/08/03(金) 02:41:17 ] >>776 あれ、それと同じ問題なのかな? 実はそれを教えていただいた>>616 は自分なんですよ。 ただ、>>616 の場合はxpressiveの正規表現のコンパイル時にスタックが 壊れてSEGVになっていたのですが、 boost::regexの場合は、バックリファレンス含みの正規表現で検索すると、 SEGVではなく、boost::regexが例外をスローしていました。
778 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:49:13 ] じゃあこれかな ttp://capslockabcjp.kitunebi.com/faq.html#boost-bug
779 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:51:50 ] バグってるのはお前くらい
780 名前:710 mailto:sage [2007/08/03(金) 02:54:02 ] >>778 実はそれをboostスレに報告したのも自分なのです。 その正規表現の例を見ればモロバレでしょうが。 随分前にそれで「使い物にならん」と判断して放置していたのですが、 ここ数日、ふと思い立ってxpressiveで組みなおしてみたのです。
781 名前:デフォルトの名無しさん [2007/08/03(金) 02:58:01 ] 使い物にならんのはお前くらい
782 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:11:23 ] この流れは酷いな。
783 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 04:53:07 ] filter.hppってなんじゃらほい
784 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 08:14:09 ] STLportとかApache C++ Standard Libraryとかはどう?
785 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:39:09 ] script言語はC/C++で書いてある 比較すること自体バカらしい・・・
786 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:52:46 ] cpythonよりIronPythonのが速いっつー話もあるけどな
787 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 21:58:54 ] class Base{ protected: int a = 0; public: int Test(){ return ++a; } } class Dev : public Base{ public : int Test(){ a += 2; return a; } } int main () { Base * b = new Dev(); printf ( "%d", b->Test() ); } こうやると 1 と表示されます これを2と表示させる(Devクラスの方のTest関数を呼び出す)ことってできないですかね?
788 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 22:00:09 ] virtual
789 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 22:13:27 ] お、できました ありがとうございます
790 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:25:50 ] もう一つ質問です Base * b = new Dev[10]; for( int i = 0; i < 10; ++i ){ b[i]->Test(); } こういうようなことをやっているとループが何回か回った後で メモリ外アクセス落ちちゃうんですが何が原因かかわかりませんか?
791 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:33:59 ] >>790 つーかそれコンパイル通らないだろ
792 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:35:03 ] Base * b = new Dev[10]; for( int i = 0; i < 10; ++i ){ b[i].Test(); } こうですた
793 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:40:53 ] 配列をポリモルフィックに扱ってはいけない それをやりたいならポインタの配列とかでやるべき
794 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:49:00 ] boost::scoped_array<Base> b( new Dev[10] ); for( int i = 0; i < 10; ++i ){ b[i].Test(); } ならおk?
795 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:49:38 ] >>793 そうなんですか? ポインタの配列というと、下のような感じでいいんでしょうか? Base **b = new Dev*[10]; for( int i = 0; i < 10; ++i ){ b[i] = new Dev(); b[i].Test(); }
796 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:53:33 ] >Base **b = new Dev*[10]; これコンパイル通らないだろ。
797 名前:793 mailto:sage [2007/08/03(金) 23:55:00 ] >>795 ソースはMore Effective C++の第三項。ぜひ一読を
798 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:56:31 ] >>794 同じこと。
799 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:57:42 ] >>795 ねたじゃn
800 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:59:41 ] >>796 Base **b = new Base*[10]; はいけましたが Base **b = new Dev*[10]; はダメみたいです
801 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:12:01 ] ポインタの配列調べてきました、こんなんでいいんですか? malloc久しぶりに使いますた Base **b = (Base**)malloc(10 * sizeof(Dev*)); for( int i = 0; i < 10; ++i ){ b[i] = (Dev*)malloc(10 * sizeof(Dev)); b[i].Test(); }
802 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:13:52 ] >>801 Base やら Dev やらは構造体なの?
803 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:14:46 ] >>802 >>787 のやつです
804 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:16:00 ] mallocじゃコンストラクタが走らないだろう・・ Devを指すBase*の配列を作ればいいと思うよ、多分
805 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:27:19 ] こうか? typedef Base* PBase; std::size_t n = 10; PBase** b = new PBase[n]; for (std::size_t i = 0; i < n; ++i) { b[i] = new Dev; b[i]->Test(); } いい加減boost::ptr_vector使えとか言いたい。
806 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:28:11 ] ptr_vectorはalgorithmが使えないから・・・
807 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:33:47 ] >>806 boost::indirect_iteratorでなんとかなる話?
808 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:39:59 ] 違う、アルゴリズム体操の話。
809 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:42:20 ] >>807 くやしく
810 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:42:59 ] なんだあほか
811 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:49:08 ] >>809 www.boost.org/libs/iterator/doc/indirect_iterator.html#example value_typeがT*(一般に*演算子が使える型)なイテレータをラップして value_typeがTであるイテレータにするアダプタ。
812 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:55:04 ] >>805 さんの方法で上手くいきました、ありがとうございます
813 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 02:58:29 ] こういうこんがらかるようなソースは嫌い
814 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:03:32 ] こんがりコーン
815 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:04:27 ] 普通に一個一個newすればいいのに
816 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:12:07 ] newが現れた。newが現れた。・・・おや?new達の揚子江が・・・・・!?
817 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:22:39 ] 兆候って言えよ
818 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:30:45 ] template <typename T> void f( typename boost::call_traits<T>::param_type x); みたいな定義で type x; f(x); のようにして使いたいんですが(要はf<type>(x)とかするのがめどい) 何か良いアイデアありませんか?
819 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:53:48 ] template <typename T> void f(T x)ならそのままf(x)できるけどboost::call_traitsってなんだっけ?
820 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:54:11 ] f(x)で呼べるだろ。
821 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:55:27 ] >>819 boost::call_traits<T>::param_typeは、 引数がクラス型ならconst T&、組込型ならTというように、引数に最適の型になる。
822 名前:819 mailto:sage [2007/08/04(土) 12:56:31 ] >>821 だったら>820。
823 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:14:08 ] 普通に考えればそうなるはずなんですが、結果は #include <boost/call_traits.hpp> template <typename T> void f(typename boost::call_traits<T>::param_type) {} int main() { int x; f(x); } error C2783: 'void f(boost::call_traits<T>::param_type)' : テンプレート 引数を 'T' に対して減少できませんでした 'f' の宣言を確認してください。 oops。。。
824 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:24:07 ] コンパイラは何? vc6だとboostの一部は使えないよ。
825 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:40:31 ] 工工工工工工エエエエエエ(´д`)エエエエエエ工工工工工工
826 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:42:43 ] VC8です あとGCC3.4でも試してみたが駄目ですた 型推論が上手く行かない為だと思うんですが、これはバグなのか 言語仕様上の限界なのかよくわかりません
827 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:14:16 ] 2.5 というのをファイルから読み込んだんですが、これを小数(Float)に変換するには どうすればいいんでしょうか?
828 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:17:26 ] ↑質問をちょっと訂正です 変換する上で便利な関数はありますか? atoiか何かで1文字づつ変換して入れてくしかないんでしょうか?
829 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:28:47 ] atof(), strtod()
830 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:29:03 ] ありゃまatofなんて関数があったんですね 解決しました
831 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:42:03 ] あとふ
832 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:46:03 ] acof
833 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 18:51:54 ] >>826 ググったら上のほうにこんなのがあった。 lists.boost.org/Archives/boost/2005/09/94177.php どうやらC++の仕様らしい。
834 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 19:17:57 ] 関数ブロック内で定義した関数って、 外部リンケージと内部リンケージどっちなんですか? 関数はstatic以外、外部リンケージつう説明を読むと外部リンケージですけど、 別のファイルから使うことなんて出来ないですよね? てか、リンケージの説明が微妙によくわかりません。 なんか良い説明してるページってありますか。
835 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 19:46:56 ] warning: ISO C forbids nested functions
836 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 19:58:55 ] >>835 ああ・・・ああ・・・・なんてこったい。 で、入れ子関数はGCCだと内部リンケージになるらしいですね。
837 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 21:23:18 ] void hoge() { struct nested_fn { void foo() { /* valid nested function */ } }; }
838 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 22:18:04 ] ちょっと組込み系で 簡単なGUI作っているのですが GUI部分とメインロジックを接続するイベントモデルを 設計しているのですが、最近のトレンドだとどんな 感じで実装してるのですか? 関数ポインタ方式 シグナル-スロット方式 ターゲット/メッセージ方式 とかなのかな? あと実際に実装してみようと思うと何かうまい資料とか あると助かるのですが、みなさんは実装しようとしたとき 何を参考に実装しているの?
839 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 04:49:13 ] XMLResourceかね、XULみたいな でも組み込みじゃ無理か
840 名前:デフォルトの名無しさん [2007/08/05(日) 05:08:02 ] C++でSingletonなClassを実装したいのですが、staticを使う方法しか思いつきません。 出来ればstaticを使用せずに実現したいのですが可能でしょうか。 具体的なコードや、参考HPのURLを示していただけると助かります。 よろしくお願いします。
841 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 05:22:37 ] static 使わずに Singleton なんて無謀
842 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 05:25:15 ] extern
843 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 05:27:56 ] なんでstaticを使いたくないんだろうか?
844 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 05:30:46 ] インスタンス取得関数を friend 関数で作り、 そのインスタンスへのポインタをグローバルに置く、 くらいが限界か。 全く意味がないけど。
845 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 06:05:06 ] ファクトリ用のクラスを作ってそこでインスタンスを管理するとか。 もっともファクトリにstaticが必要になるような気もするけどw
846 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 08:34:24 ] C++以外の言語でもstatic相当のものを使わないと無理だよな。
847 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 09:25:28 ] うまく説明できないんですが、BCBで何も考えずに__closure使ってます。 これを使わない場合、どう書けばいいですか?エスパーさんよろしこ
848 名前:エスパー mailto:sage [2007/08/05(日) 09:27:07 ] 死ね
849 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 09:36:20 ] 説明できないならソースで説明してくれ
850 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 09:38:27 ] しょうゅdeも11お
851 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 09:58:55 ] delete x,y,z; はOKなのに、配列に対する delete [] x,y,z; で、うまくいかない理由を教えてください。 一文で各方法はないでしょうか?
852 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:04:14 ] >>851 delete x,y,z;も全然良くない。 deleteとdelete[]演算子は1つしか演算対象を取らない。 また、カンマ演算子は最低の優先順位なので、こうは書ける。 delete x, delete y, delete z; delete[] x, delete[] y, delete[] z; 1行に複数文を並べるのと大して変わりはないが。
853 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:07:54 ] マクロ
854 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:08:33 ] 配列と通常のやつのdeleteが異なるってことが気にくわねぇなら プリプロセッサとmplを組み合わせて、delete_(x, y, z,...);みたいな物作ろうぜ 既に誰かが作ってるかもしれないが
855 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:11:44 ] そもそも配列new[]は使わないし、 deleteも生で使うのはダサい。