1 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:15:45 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.70【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1258873470/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め) ◆ソースのインデントについて 半角空白やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。
83 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 16:37:42 ] つ boost::exception
84 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:48:55 ] >>81 >>83 やっぱり継承するなりなんなりするしかないか
85 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 18:37:02 ] >>78 デストラクタを private にしてみるとか。 class Hoge { private: ~Hoge() {} };
86 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 18:50:11 ] まともに使えねえよ
87 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 19:06:09 ] C++0xの[[final]]も継承禁止じゃないしな
88 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 19:08:30 ] iface *create(...) { class local : public iface { ... }; return new local(...); } 制限はあるけどこれでfinalだよ
89 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 20:52:17 ] 教えて下さい。 今お仕事のデバッグ用にSDカードのセクタをFATではなく セクタ直接アクセスするコードを今使ってます。 そのソフトでドライブ選択をGetDriveType()でリムーバブルディスクのみを 選択できるようにしておるのですが、これではカードリーダーライターに 刺さったディスク全て選択できてしまいます。(例えばCFとかUSBメモリとか) 自分だけで使う場合は注意すればいいだけなのですが、チームで使ってるんで できればドライブ選択をSDカードONLYにしたいと思っているのですが、 どのようなコードにすればいいでしょうか? 環境 WindowsXP Microsoft VisualC++ 6.0 MFC
90 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 00:22:22 ] >>71 どの方法にも何のメリットも感じられない。 そのままにしとくのが一番スマートな気がする。 >>80 #define OUT_OF_RANGE(what) (std::out_of_range(std::string(__FILE__":"BOOST_PP_STRINGIZE(__LINE__)": ") + (what)))
91 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 01:59:50 ] >>62-63 ありがとう。できるだけ根本的に修正するようにしてみる。 ついでに、このコードについても教えてくれないか。 ttp://codepad.org/novJOf5Z これ、仕事で使ってるgcc4.1.1とcodepad(gcc4.1.2)では警告されるのに、cygwinのgcc4.3.2だと、 -fstrict-aliasingと-Wstrict-aliasingを指定しても警告されないんだ(-Wstrict-aliasing=2を加えれば警告される)。 このへんの動作って4.1.2以降で変更されてる? gccのchangesを見たけど、関係ありそうなのは4.2の The C++ frontend now also produces strict aliasing warnings when -fstrict-aliasing -Wstrict-aliasing is in effect. くらいしか見つけられんかった。
92 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 05:32:31 ] >>91 どうしてそんな碌でも無いコードばかり書くんだ… GCCのchangelogに書いてあるのは大きなものだけだから 知らないうちに内部の動作が少々変わることはありうるよ 無印の-Wstrict-aliasingで警告がでないのが正しいかはわからん そこらへんの加減はgccの中の人にしかわからんだろうから…
93 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 09:36:50 ] #include <iostream> #include <fstream> #pragma pack(push, 1) struct POD { int a, b; char str[5]; int x, y, z; }; #pragma pack(pop) void test(POD &pod) { std::cout << "a: " << pod.a << std::endl; std::cout << "b: " << pod.b << std::endl; std::cout << "str: " << pod.str << std::endl; std::cout << "x: " << pod.x << std::endl; std::cout << "y: " << pod.y << std::endl; std::cout << "z: " << pod.z << std::endl; }
94 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 09:37:33 ] void save(POD &pod) { std::ofstream out("test.bin", std::ios::binary); out.write((char*)&pod, sizeof(POD)); } void load(POD &pod) { std::ifstream in("test.bin", std::ios::binary); POD tmp; in.read((char*)&tmp, sizeof(POD)); pod = tmp; }
95 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 09:39:19 ] int main(void) { POD pod1 = {1, 2, "test", 3, 4, 5}; test(pod1); save(pod1); POD pod2 = {0}; load(pod2); test(pod2); return 0; } 上記のコードは自分のマシンだと期待通りに動いてるようなんですが ほかのマシンに移植しても大丈夫でしょうか?
96 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 09:44:54 ] intの奇数番地アクセスに問題ないCPUだったら、大丈夫かも
97 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 10:01:24 ] >>96 レスありがとうございます 念のためpack(push, 4)にしてみます
98 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 10:07:15 ] 移植性考えるなら stdint.hを読み込んで int を int32_t とかに
99 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 12:44:50 ] >>98 レスありがとうございます バイト数も揃えてみます vc++にstdintが無いのが困りものですがvs2010にはあるようなので・・・
100 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 13:21:04 ] >>92 >どうしてそんな碌でも無いコードばかり書くんだ… ごめんw 実は>>91 は、社内製コードでLoadFileAsync(const char* filename, void** buffer)っていうのがあるんだけど、 これがgcc4.1.1にしたら警告が出たので、調査用に書いたんだわ。 動作は、filenameを非同期にディスクから読み出して、読み出したメモリ領域のアドレスをbufferに返す。 非同期ロード用クラスでも作って、void**を置き換えればいいんだろうが、 既にあちこちで呼ばれてる関数だから手を出しづらいんだよね。
101 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 16:21:27 ] >>99 ttp://www.kijineko.co.jp/node/63 こういうのがあるよ
102 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 23:42:27 ] >>100 それでもその強引なキャストは要らんのでは? A a; void* p; f(&p); a.str = static_cast<char*>(p); もしかしてメモリ領域の確保も非同期なの?
103 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 01:25:07 ] ヘッダファイルの中で#includeの替わりに,classが使われている時があります #includeをclassにすると、何かいい事があるのでしょうか? また、QWidgetは#includeもclassも書かれていませんが なぜ、使う事ができるのでしょうか? calmlight.s2.zmx.jp/Qt4Examples/SimpleMenu.html
104 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 01:34:59 ] 「#includeの替わりに,classが使われている」わけじゃない 前方宣言でググれ というかC/C++の#includeはJavaのimport、C#のusingとは違うぞ
105 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 06:58:32 ] >>103 もうC言語やC++のプリプロセッサっていう勉強をした方がいいんじゃないか?
106 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 09:24:40 ] 継承元クラスを引数で受けた時に、そのprotectedメンバにアクセスできないのは どういう理由でそうなっているのでしょうか? class A { protected: int x; }; class B : public A { public: void operator=(const A& a) { x = a.x; //a.xはprotectedで操作できない }; };
107 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 09:30:31 ] >>106 別のクラス class C : public A (略)などが、 B とは違う都合でそいつを使っている かもしれないから。 めんどくさいから protected なんて最初から使わなけりゃいいんだよ。 private or public でいけないのか、よく考えたほうがいい。
108 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 09:45:32 ] >>107 適当なこというな >>106 自分がAをpublicに継承してアクセス可能になるのは this->aであって 引数としてAを受けた時は外部からのアクセスになる つまりAのpublicなメンバにしかアクセスできない (自分がAを継承してるかなんて全く関係ない) 上のケースでやろうとしてるのはこれと変わらない void f(const A& a){ int a=a.x; } protectedなメンバは 「この機能は継承してから使えな」、っていう意思表示なのに 継承前のAのデータにアクセスできたらおかしいでしょ
109 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 10:04:23 ] だったら外からアクセスしてるのに同じクラスのprivateにアクセス出来るのはおかしいはず
110 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 10:05:47 ] >>108 あんたのそれは何か根拠があるのかね? > 自分がAをpublicに継承してアクセス可能になるのは > this->aであって > 引数としてAを受けた時は外部からのアクセスになる protected がそうなってる( private と違う)理由を聞かれてるんだよ。 ちなみに、 A の継承が public であるかどうかは関係ないし、 this->a 以外にも B& b という引数に対してなら b.a でアクセスできる。 > protectedなメンバは > 「この機能は継承してから使えな」、っていう意思表示なのに > 継承前のAのデータにアクセスできたらおかしいでしょ その説明だと、別の派生クラス C の C& c について B のメンバ関数内で c.a にアクセスできない理由の説明にならないね。
111 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 10:17:53 ] >>100 >>92 に追記しておくけど -Wstrict-aliasingは全ての問題があるケースを警告するとは限らない -Wstrict-aliasingは-Wstrict-aliasing=3と同じで -Wstrict-aliasing=1が最も「少しでも怪しければ警告にする」けど それでもit has very few false negativesとしか言われてない gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Warning-Options.html#index-Wstrict_002daliasing_003dn-317 製品としてgccの最適化によるバグを絶対回避したいなら -fno-strict-aliasingにしてこの種の最適化を無効にするしかない
112 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 10:23:47 ] >>111 > -Wstrict-aliasing=1が最も「少しでも怪しければ警告にする」けど > それでもit has very few false negativesとしか言われてない それ、 "when higher levels do not ... , as it has very few false negatives" の ところで、 1 より上のレベルについて言ってるところだよ。レベル 1 については "it has many false positives" ってなってる。
113 名前:112 mailto:sage [2010/02/05(金) 10:28:46 ] ん?ごめん、読み違えた。 Level 1 だと false negative が少なくて(でもゼロじゃなくて)、かわりに false positive は多いってことか。 112 は忘れて。
114 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 15:57:26 ] ifstream と Win32 ReadFile のメリットとデメリットを教えてください ReadFileはwindows依存していることは知ってます、ifstreamの内部ではReadFileを使っている(?)とかどってでみた気がする 速度を比較してみたらifstreamの方がはやかったです
115 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 16:02:59 ] 1バイトずつReadFileを呼び出したりしていないか? ifstream等は内部にバッファを持って一度の呼び出しで多くのデータを読み込むようにしてAPIの呼び出し回数を抑えているはず
116 名前:114 mailto:sage [2010/02/05(金) 16:10:02 ] ReadFile引数のブッファ指定のところでファイルサイズ渡しているので1バイトずつではないはず
117 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 16:45:56 ] 普通のファイルを普通に読むとOSは勝手にディスクキャッシュするよ
118 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 17:24:52 ] それだとReadFileが遅い理由にならんのでは
119 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 17:28:37 ] いきなりファイル全体キャッシュするわけじゃないから
120 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 18:04:54 ] ディスクアクセスのコストはOSのディスクキャッシュで隠蔽できても システムコール(カーネルとのモード遷移)のコストは隠蔽できません。 ReadFileを何度も何度も呼び出している限り。
121 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 19:48:25 ] ifstreamが速い理由にならんぞ
122 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 20:15:36 ] ナニ言ってんだオマエは
123 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 20:16:50 ] ちなみに stdioと比較してifstreamは全然速くない。
124 名前:デフォルトの名無しさん [2010/02/05(金) 20:23:02 ] 比較しちゃだめだろ iostreamの良い所は別にあるんだから。 何かというとそれは次の人どうぞ ↓↓↓
125 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 20:39:29 ] 継承によって作られている所です つまり入力元や出力先だけではなくstringstreamのように 根本的な構造が異なっても全く同じイメージで操作できる事です とでも言って欲しいのか?
126 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 21:52:34 ] >>114 どんなコードで比較したのかわかるようにコードを晒さないと答えられないな。
127 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 22:16:09 ] >>114 ReadFileの使い方を間違ってるんじゃないか? ifstreamを書いた人はReadFileの使い方をよく知ってるんだと思うよ。
128 名前:デフォルトの名無しさん [2010/02/05(金) 23:44:41 ] メッセーッジについて教えてくれ WM_NOTIFYとON_NOTIFY_REFLECTの関係がわからない 調べたところWM_NOTIFYのメッセージが贈られるとるとON__NOTIFY_REFLECTが呼び出されれウ みたく書いてあったけど じゃあON_NOTIFY_REFLECTがもってる通知メッセージは何よ? わかりやすくおしえてね
129 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 23:49:40 ] >>128 は? 頭おかしいの?
130 名前:デフォルトの名無しさん [2010/02/05(金) 23:50:12 ] >>128 Win32API質問箱 Build86 pc12.2ch.net/test/read.cgi/tech/1265350980/
131 名前:デフォルトの名無しさん mailto:sage [2010/02/05(金) 23:52:04 ] どっちかというとMFCのほうだな
132 名前:デフォルトの名無しさん [2010/02/06(土) 02:27:22 ] PaintDCの描画領域のクリア方法教えて
133 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 10:22:50 ] InvalidateRectもしくはValidateRectのことか それともFillRectのことだろうか
134 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 13:22:55 ] template< int Foo > class CHoge { public: CHoge(int ini) : m_hoge(ini){} int m_hoge; char m_foo[Foo]; static const CHoge<Foo> sc_Zero; }; //const CHoge<Foo> CHoge<Foo >::sc_Zero = CHoge<Foo>(0); // Foo : 定義されていない識別子です。 sc_Zero を初期化したいんだけど,どのようにすればいいでしょうか?
135 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 13:38:26 ] Fooの値は決まる必要があるんじゃね? template< int Foo > class CHoge { public: CHoge(int ini) : m_hoge(ini){} int m_hoge; char m_foo[Foo]; static const CHoge<Foo> sc_Zero; }; CHoge<1> h(10); const CHoge<1> CHoge<1>::sc_Zero(h);
136 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 13:41:57 ] template < int Foo > const CHoge<Foo> CHoge<Foo >::sc_Zero = CHoge<Foo>(0);
137 名前:134 mailto:sage [2010/02/06(土) 13:51:57 ] >>135-136 ありがとうございます.初期化出来ました.
138 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 17:31:35 ] 前方宣言をすると普通に#includeするよりも、コンパイルが速くなりますか?
139 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 17:33:57 ] 前方宣言はコンパイル依存性を減らしたりするために あると思うんだけど
140 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 17:39:20 ] >>138 コンパイルが速くなるっていうよりも、コンパイルしなおさなければいけなくなるファイルが 減るっていうのが正しいかと。
141 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 18:05:26 ] 前方宣言が必要なパターン class B; class A { B b; }; class B { A *a; }; あとはpimplイディオムで少し似た使い方したり。
142 名前:138 mailto:sage [2010/02/06(土) 18:06:41 ] >>140 やっぱり、そうだよね thx
143 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 22:06:12 ] newとmallocは似たような動作をしますが、 バックグラウンドではnewがmallocを呼び出しているのですか?
144 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 22:09:27 ] >>143 そういう実装も多いけども、そうとは限らない。 それが問題になるようなプログラムを書くべきではないし、書く必要も無い。
145 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 22:48:57 ] WinAPIを使わずにマウスをプログラム側から操作するにはどうしたらよいでしょうか?
146 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 22:50:12 ] そういうライブラリを探す。
147 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 22:57:22 ] >>145 それは不可能だろう。 ラッパライブラリがあれば可能だろうが、 そのラッパもやはりWinAPIは使っているだろうな。
148 名前:デフォルトの名無しさん [2010/02/06(土) 23:43:39 ] VS2005、C/C++でコントローラ(Joystick)の状態を取得するにはどうすれば良いのでしょうか? 調べても中々出てこないみたいなので。助けてください。 プロジェクト設定はWin32コンソールアプリケーションです。 ひどいくらい初心者ですが、よろしくお願いします。
149 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 23:53:46 ] GetJoystickState
150 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 00:13:35 ] >>148 Windows APIか、DirectXのDirectInputを使う Joystick Reference (Windows) ttp://msdn.microsoft.com/en-us/library/dd757121(VS.85).aspx DirectInput ttp://msdn.microsoft.com/en-us/library/ee416842(VS.85).aspx ttp://msdn.microsoft.com/ja-jp/library/bb219802(VS.85).aspx
151 名前:デフォルトの名無しさん [2010/02/07(日) 00:30:49 ] DirectInputは使っています。 printf("%d\r\n",js.lX); で一応、初期値の -8 とプリントされているのですが、 動かしても変動がありません。どうも倒しながらキーボードを入力すると数値が変動するようです。 現在はキーボード入力で入力したときだけOpenGLが再描画されるのですが これをJoystickを倒した時に再描画されるようにするにはどうすればよいのでしょうか? switch (key) { case 'd': { Point NextPos( PosX+0.2, PosY ); if( !ColCheck( NextPos ) )PosX +=0.2; glutPostRedisplay(); } ソースはこんな感じになっています。キーボード入力時のみの再描画ではなく、常に?描画するにはどうすればよいのですか? 初心者ですみません。書き込んでいて何を言ってるのかわからなくなってきました。
152 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 00:45:10 ] OpenGLスレで聞いてみれば?
153 名前:デフォルトの名無しさん [2010/02/07(日) 00:50:10 ] はい、そうしてみます。ありがとうございました。
154 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 02:47:37 ] void *型から何かの型へのポインタへキャストする時にそれが有効か調べるいい方法はあります? 今のところハッシュにアドレスとtype_infoのペア保存しておくという微妙な方法しか思いつきません
155 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 07:03:04 ] >154 dynamic_cast かな。 でもどっちかっていうと型判別しなきゃいけないこと自体がどっかおかしいような気がする。
156 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 07:19:04 ] void * にdynamic_castは無理
157 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 08:14:09 ] C++にはリフレクションがないから無理だろ
158 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 10:01:05 ] >>154 shared_ptr があるよ
159 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:15:33 ] struct hoge { int bar1; char *buf; int bar2; }; こんな構造体のbufに文字列入れるなりmallocするなりするとメモリ的にはどうなるの? bar2がその分後ろにずれたりするの?
160 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:22:14 ] template<size_t T_size>struct hoge { int bar1; char buf[T_size]; int bar2; };
161 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:22:50 ] >>155 void*なんか使わないほうがいいと言えばそのとおりなんですが スクリプトと拡張型のポインタをやり取りするのに一回void*に変換されて型情報がなくなってしまうのです スクリプト側で変なことしなければ問題はないんですが、間違えるとエラーも出せずに落ちてしまうのでどうにかできないかな、と >>156 ,157 やっぱり無理・・・でしょうか >>158 すいません 詳しくお願いできますか?
162 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:45:30 ] void*のポインタ先をデータの生ポインタではなく、 struct ptr_holder { void *ptr; type_info ty; }; のポインタとかにはできないの?
163 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:54:49 ] >>161 void*を何かのクラスに変換するのはプログラマの責任になるんだね。 変換方法はプログラマから決めないといけないけど、1種類のクラスしか扱えないのが実情。 そこで、複数のクラスを扱うには、>>162 のように1種類のクラスを挟んでクラスを識別できるようにして変換する。 それをやっているのが>>158 の方法。shared_ptr<void>へのポインタshared_ptr<void>*をvoid*として渡し、shared_ptr<void>*に戻す。その後、shared_polymorphic_cast<Hoge>(*Ptr);で変換。型が違えば例外が投げられる。
164 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:56:54 ] >>159 ずれない +------+ 0x11111100 | bar1 | |------| 0x11111104 | buf | ---> NULL |------| 0x11111108 | bar2 | +------+ ↑こんな感じのが ↓こんな感じになるだけ +------+ 0x11111100 | bar1 | |------| 0x11111104 | buf | ----+ |------| | 0x11111108 | bar2 | | +------+ | +------+ | 0x22222200 | 文字列 | <--+ +------+
165 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 12:13:53 ] >>163 shared_ptrのその使い方はshared_ptrの本来の使い方の一部にしかすぎない。 shared_ptrの本来の使い方を知った上で使うべき。
166 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 12:13:58 ] >>162 残念ながら、ptr_holder*をvoid*にして渡すという形になりますので 結局のところvoid*がptr_holder*に戻せるかという、ほぼ同じ問題に戻ってしまいます >>163 やはりvoid*がshared_ptr<void>に変換できる保証はないので、完全では無いですね でも同一プロジェクト内でならshared_ptrに統一することは可能なので試してみたいと思います みなさんレスありがとうございました
167 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 12:39:16 ] >void*がptr_holder*に戻せるか そこは当然ptr_holderしか使わないという縛りが必要になる
168 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 12:50:54 ] void*やshared_ptr<void>ではなく、boost::any(あるいはany*やshared_ptr<any>)にしたらいい。
169 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:23:09 ] LinuxでC++勉強したいんだけど ライブラリって何が標準なの?
170 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:25:02 ] gccとかのこと?
171 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:25:38 ] >>169 まずは C 標準ライブラリと C++ 標準ライブラリだな。
172 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:29:38 ] >>171 boostというのが標準ですか?それともSTLというのですか?
173 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:35:08 ] >>172 boost は標準ではないが、将来の標準に含まれるものを含んでいる。 STL は昔の名前で、今は C++ 標準ライブラリに含まれている。
174 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:38:54 ] >>172 boostは標準ライブラリではない。 だが信頼性・移植性のある外部ライブラリだと思う。 あとboostのすごいところは最先端をめっちゃ追求しているところかな。
175 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:45:36 ] boostは盛りだくさんだから、ひとくくりで全部OKとかダメだとは言いにくいな。
176 名前:progress_display mailto:sage [2010/02/07(日) 15:49:25 ] >>175 私のことお呼び?
177 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 16:40:18 ] 昨日違うスレで質問しましたが、質問させてください public void setXXX(Foo* f)というメソッドがあった場合、 1.setXXX(f);→fはポインタ 2.setXXX(&f);→fはポインタではなく、fのアドレスを渡している 普通にプログラミングをした場合は、1 or 2のどちらでも大丈夫だと思います しかし、GUI関係をプログラミングした場合は、2の方法はダメな可能性が高いと思うのですが 結局はGUI Tool Kitに依存するといいうことでしょうか?
178 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 16:47:07 ] fがFooのポインタなら1だし、Fooのインスタンスなら2 ツールキットとかそういう問題じゃない そもそもpublic void setXXXは通常なら構文エラー
179 名前:177 mailto:sage [2010/02/07(日) 16:51:15 ] >>178 1はFoo* f = new Foo(); 2はFoo f; で宣言しています >そもそもpublic void setXXXは通常なら構文エラー 何故?
180 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 16:58:25 ] そのGUIオブジェクトがローカルスコープ限りで削除されるような場合は別に2でも問題ないと思うけれど デバイスコンテキストとかはそういう使い方をしそうだがウィンドウとかはあまりそういう使い方をしないだろう
181 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 17:06:54 ] >>179 エラーってのは、publicの後ろにコロンが付いてないだけのことだと思う。
182 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 17:06:54 ] >>177 > GUI関係をプログラミングした場合は、2の方法はダメな可能性が高いと思うのですが なんで? 意味わかんない。 可能性が高いとかグダグダ言ってないで、関数の仕様を確認すればいいのに。
183 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 17:15:50 ] スタックやヒープといったメモリ領域はご存じ?
184 名前:177 mailto:sage [2010/02/07(日) 17:56:51 ] >>180 それもそうですね >>181 java出身なもので、うっかりやってしまいました >>183 yes
185 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 18:14:18 ] 177がなんでそんな疑問を持ったかのほうが気になる そもそも実引数fの型がFOOへのポインタだとしたら 上の1と2は全く同じ意味だというのは分かってる?
186 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 18:17:44 ] 185は忘れてくれ
187 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 18:21:54 ] >>185 ドンマイ。たまにうっかりしちゃうよな。
188 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 18:39:49 ] >>177 は何かを勘違いしてる気がする。 public : void setXXX(Foo* f); Foo fOrg; Foo* f = &fOrg; 1.setXXX(f);→fはポインタ 2.setXXX(&fOrg);→fOrgはポインタではなく、fOrgのアドレスを渡している これでどっちも同じになるんだが。
189 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 18:47:44 ] >>188 いや、たぶんそれ自体は理解してるんじゃないかな GUIアプリで、長期間あるオブジェクトを使うような場合に、 ヒープにとるべきか(1)スタックにとるべきか(2)という質問なんじゃないの
190 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 18:54:41 ] じゃあ、インスタンスの寿命を気にしてるってことか。 そんなのJavaもC++も一緒じゃないの? スコープを抜けたらデストラクタが実行されるでしょうよ。
191 名前:190 mailto:sage [2010/02/07(日) 18:56:52 ] ごめん違った。Javaはfinalizeがいつ実行されるのか分からんのね。
192 名前:177 mailto:sage [2010/02/07(日) 19:11:12 ] >>189 その通りです。そういう質問です ttp://gihyo.jp/dev/feature/01/qt/0003?page=2 >1.子ウィジェットのメモリ解放の自動化 を読んでいたら疑問が湧きました >>188 には↓と書いていますが、 >これでどっちも同じになるんだが。 1.Foo fOrg;←スタックにインスタンスが確保されるハズ 2.Foo* f = new Foo();←ヒープにインスタンスが確保される 2の方法だとヒープにあるインスタンスはdeleteしないと削除されませんが、 1の方法だと自動的に削除されるのでは?と考えました もしも、1の方法で自動的に削除されなかった場合、 スタック(first in first out)なので「他の変数も削除されなくなる可能性」があるんじゃないかな〜と わかりずらくて、スマソ
193 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:18:21 ] 1のやり方で自動的に削除されるよ f自体は削除されるが fのメンバにポインタがあった場合 そのポインタがさしてる先が削除されるかは ちゃんとそういう処理を書いたかってことによる
194 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:20:45 ] いや、スタックってLIFO: Last In First OutまたはFILO: First In Last Outだから。 スタックに確保したインスタンスは、スコープを外れれば自動的に削除されます。 つまりスコープを外れない限りは自動的に削除されることは無い。 削除されないならそのシステムが腐ってる。 LIFOをイメージ出来れば今回の疑問は解決するはず。
195 名前:177 mailto:sage [2010/02/07(日) 19:35:38 ] >>193-194 なるほど、いろいろと勝手にやってくれて やってくれなかった場合はシステムが腐っているってことですね --------------------------------------------------------------------- qt4を参考に、適当に考えてみたコードなのですが class MainWindow { //ウインドウ関係のクラス public: void setWindowTitle(string* s); void init() { string s = "これの方法は安全なのか?"; mainWindow.setWindowTitle(&s); mainWindow.show(); //guiのイベントループを開始する } mainWindowが終了した段階で、MainWindowがstring sをdeleteする また、mainWindow.show();はブラックボックスかされていて、 init()の方が最初に終わるかもしれないという条件の場合 //かなり、腐っている気がするけど string s;はやっぱり、string *s = new string("テスト");とした方がいいんですね? 最後にこの質問だけ教えてください
196 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:38:41 ] 「1の方法で自動的に削除されなかった場合」ってどういう状況でそうなると思った? システム的には、>>194 の通り、スコープを外れたら自動的にデストラクタが呼ばれる。 >>193 の言うようにそのデストラクタ内の処理で必要なものを解放していなければメモリリークになる。 Javaみたいに、オブジェクトがどこからか参照されている間は削除されないなんてことはないので、 もしsetXXX(&f)することで生存期間が伸びるとか思ってるなら間違い。 無効なアドレスに対してアクセスが発生して、運が良ければ落ちるし、最悪の場合は黙って動き続けることに…
197 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:39:48 ] >>195 string*はやめてconst string&で受け取った方がいい MainWindowにWindowTitleのメンバを用意して、 コピーコンストラクタでコピーするべき
198 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:41:20 ] コピーコンストラクタは間違いだった。
199 名前:177 mailto:sage [2010/02/07(日) 19:56:45 ] >>196 >Javaみたいに、オブジェクトがどこからか参照されている間は削除されないなんてことはないので、 >もしsetXXX(&f)することで生存期間が伸びるとか思ってるなら間違い。 なるほど、それが聞きたかった わかりました、ありがとうございます >>197 >string*はやめてconst string&で受け取った方がいい うーん、それは危なくないですか? >init()の方が最初に終わるかもしれないという条件の場合 という条件があるので
200 名前:196 mailto:sage [2010/02/07(日) 19:56:46 ] 更新してなかった >>195 の条件ならどっちもダメ newした場合は自分でdeleteしなきゃいけないので、メンバ変数とかに持っておく必要がある >>192 のQtの場合は、親ウィジェットから辿れる子ウィジェットについては、 親ウィジェットのデストラクタ内でdeleteを呼んでくれてるってことだと思う そういうフレームワークを使うなら自分でdeleteする必要はない(というかしたらまずい) あと直接関係ないけど、 スタックを使う場合は、Javaには真似できないRAIIって技法があるから調べてみると面白いかも ヒープの場合はスマートポインタ(boost::shared_ptrとか)を使うと安全度が高まる
201 名前:177 mailto:sage [2010/02/07(日) 20:07:03 ] >>200 >Javaには真似できないRAII これ調べておきます >mainWindowが終了した段階で、MainWindowがstring sをdeleteする こういう条件があるので↓は気にしなくていいのでは? >newした場合は自分でdeleteしなきゃいけないので、メンバ変数とかに持っておく必要がある
202 名前:196 mailto:sage [2010/02/07(日) 20:15:39 ] >>201 すまん、見落としてましたw じゃあnew以外ないね(逆に、スタックに確保したインスタンスをdeleteするのは駄目)。 ただ、関数レベルでそんな実装するのはC++的じゃないので、普通ないとは思うけど。
203 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:26:02 ] C++を習得する場合、 Java→C++よりC→C++の流れの方がやっぱりまともだな
204 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:28:11 ] なぜわざわざ荒れそうな方向へ持っていく
205 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:30:31 ] >>204 そういう荒れそうな発言は、メッ!ですよ
206 名前:177 mailto:sage [2010/02/07(日) 20:32:25 ] >>202 いろいろと、ありがとうございました
207 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:33:14 ] >>203 Cはクラスがないじゃん だから面倒くさい
208 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:34:52 ] これがゆとりか…
209 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 21:09:47 ] 2ちゃんねるブラウザで一番難しい所は、スレを表示する機能だと思うんだよね しかし、既存の専ブラはそれをどうやって解決しているのか?って所が問題
210 名前:209 mailto:sage [2010/02/07(日) 21:13:17 ] ごめん、誤爆した
211 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 21:36:08 ] C++を学ぶのにCを学ぶ必要はないよ Cの古くて危険なやり方はやらない方がいい
212 名前:デフォルトの名無しさん [2010/02/07(日) 21:48:26 ] www1.axfc.net/uploader/Sc/so/80610.zip CodeSynthesis XSD/eのサンプルプログラムをVisual C++ 2008 Express EditionのIDE上でビルドしたいのですが、リンカエラーが 大量に出てしまい出来ません。うpしたのはXSDEのライブラリとサンプル1つだけ取って小さくしたものです。 nmakeだとビルド出来るのですが、IDEの「既存のコードからプロジェクトを作成」で作成したプロジェクトでビルドすると失敗してしまいます。 www.codesynthesis.com/products/xsde/
213 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 21:51:40 ] >>211 その古くて危険なもので、今現在もどれほど多くのものが作られているか。 バカには使いこなせない、って点では確かにC++以上だとは思うけどな。
214 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 21:56:39 ] C++はポインタ操作をクラス内に隠蔽できるメリットを理解して使ってる人はどれくらいの割合いるんだろうか。 Cを知らずにSTLをいきなり使ったほうが幸せになれるのではないかと思う今日この頃。
215 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 22:00:19 ] >>213 CはCで今でもあちこちで使われているのは俺も同意だけど、それとこれとは別。
216 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 22:03:24 ] そこでAccelerated C++ですよ
217 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 23:50:57 ] >>214 deleteをほとんど出さない入門書があってもいいのではないかと思うと気がある
218 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 02:48:34 ] 「〜の数」ってときにつける変数名、皆さんはどうしてますか。 たとえばりんごの数とか…。
219 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 03:13:16 ] num_apples
220 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 03:16:40 ] 人に薦めるならcountかなぁ。 自分のプロジェクトでは、数はnum、番目はnoを使ってる。 それ一緒や!元ネタ一緒やで!というツッコミは甘んじて受けよう。 大事なことはプロジェクト内での一貫性。(あと検索一意性) それさえ見失わなければhogeでも構わん。
221 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 03:35:36 ] >>219 >>220 レスありがとうございます! 私はthe number of 〜とか考えてました。でもこれじゃあなんかな〜…と。 これからはnum、noを一貫してつけていくことにします。
222 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 07:03:31 ] プログラムからPukiWikiのページを書き換えるにはどうやればいいですか?
223 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 07:59:00 ] HTTPでしかるべきPOSTメソッドを送信すればいいと思うけど
224 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 08:19:06 ] >>223 どうもです。 HTTPというと、C++で使うのはwininetですかね。 HTTPの事も調べないといけないなぁ。
225 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 08:52:24 ] 個数ならcount 量ならamountだな
226 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 09:26:00 ] 変数名スレでやれ
227 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 09:36:02 ] Boost.Asioを使ったHTTP通信のサンプルコードはよく転がってるよ
228 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 14:39:57 ] int n; cin >> n; char buf[4096]; for(int i=0;i<n;++i){ cin.getline(buf,4096); cout << buf << endl; } このプログラムで 1 hello world という入力をしてhello worldを出力したいんですが 1 Enterの時点でプログラムが終わってしまいます 最初のcin>>nで一つ目の改行が読まれていないみたいなので驚いたんですが getlineと通常の>>は混ぜて使わないほうがいいんでしょうか?
229 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 15:06:36 ] cin>>n は数値を読むだけで改行は読まないから 改行が来るまで吐き出させるとか char c; do { cin >> c; } while (c != '\n');
230 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 20:56:46 ] string s = "str"; if( s ) { std::cout << "true" << std::endl; } このスレで条件式にインスタンスを渡してもいいと教えてもらったのですが シンタックスエラー?が出ました >/Test/main.cpp:9: error: could not convert ‘str’ to ‘bool’ why?
231 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 20:58:47 ] stringはデフォでboolに変換できない。 s.c_str()とかやりなされ
232 名前:230 mailto:sage [2010/02/08(月) 21:14:31 ] >>231 s = NULLの時はfalse、s != NULLの時はtrueと教えてもらったのですが
233 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 21:33:46 ] >>232 それは騙されたんだよ。 char* ならそうなるけど、string はそうはならない。
234 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 21:45:34 ] >>232 妄信的に考えるのは良くないよ。それは何を評価してるかわかってるのかなぁ?? stringはクラスで>>230 の使い方だと特にポインタにnewしてるわけでもないので、即インスタンスは確保される。 適当な型変換をクラスの実装による変換で要求するが、 stringは変換機構を実装してないからコンパイラさんが評価できないよ〜。ってエラーを返している。
235 名前:230 mailto:sage [2010/02/08(月) 21:45:55 ] >>233 stringだからダメなんですかね? その時は、if(オブジェクト)はなぜシンタックスエラーにならないの?って質問したんですが
236 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 21:51:23 ] >>235 ifは論理式の評価の後に最終的にはboolを要求する。 boolの基本は、0がfalse、それ以外がtrueなので、 ポインタを評価したときにポインタにNULLが入っていたらNULL==0==false相当なのでそのように動く。 凄い細かい話なんだが。。。
237 名前:230 mailto:sage [2010/02/08(月) 21:53:01 ] >>236 わかりました ありがとうございます
238 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 22:21:43 ] C++テンプレートテクニックスという本に載っていた vtableを自分で実装する方法で非仮想関数を仮想関数のように扱う方法なんですが これって普通に仮想関数を使った場合とどっちが早いんですか?
239 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 22:38:26 ] if(boolean-expression) {} boolean-expression が object だった場合、 コンパイラは次の優先順序で変換を試みる。 1. operator bool() {} 2. operator 数値型() {} 3. operator ポインタ型() {} operator bool() が実装されていない場合、 かつ operator 数値型() が複数実装されている場合は、 曖昧であるためコンパイルエラーとなる。 VC2008EEで確認したら、こんな動作だった。 これは言語仕様で定義されてるのかな?
240 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 22:51:23 ] >>238 実装によるとしか。 大抵ほぼ同じになると思うが。
241 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:09:16 ] >>238 最適化うんぬんやらスレッド安全性などを考えても、 vtableを自分で実装なんてしなくていいともうけどね。 だいたい、仮想関数のスピードがネックになる設計なんて 今まで俺はみたことないよ。 80-20の法則ってやつを思い出すしか。
242 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:10:36 ] >229 おまいは今 ignore さんの存在意義を否定した。
243 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:29:37 ] __FreeList* element = static_cast<Integer::FreeList*>(::operator new (sizeof(Integer))); __freeList_ = element; __for (int i = 1; i < BLOCK_SIZE; ++i) { ____element->next = static_cast<Integer::FreeList*>(::operator new (sizeof(Integer))); ____element = element->next; __} __element->next = 0; これの意味が解りません
244 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:30:57 ] どこが分からないの?
245 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:44:11 ] >239 もうちょい周辺の記述も有った方が分かりやすそうだけど、とりあえず以下の規定から導かれる動作だと思われ。 > 14882:2003 > 13.3.3p1 >(略) > - the context is an initialization by user-defined conversion (see 8.5, 13.3.1.5, and 13.3.1.6) and the standard > conversion sequence from the return type of F1 to the destination type (i.e., the type of the entity > being initialized) is a better conversion sequence than the standard conversion sequence from the return > type of F2 to the destination type. > > 13.3.3.2p4 > Standard conversion sequences are ordered by their ranks: an Exact Match is a better conversion than a Promotion, > which is a better conversion than a Conversion. Two conversion sequences with the same rank are > indistinguishable unless one of the following rules applies: > - A conversion that is not a conversion of a pointer, or pointer to member, to bool is better than another > conversion that is such a conversion. >(略)
246 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:52:36 ] >>244 この辺がよくわかりません。 static_cast<Integer::FreeList*>(::operator new (sizeof(Integer))); 配列を確保してるのですよね?
247 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 00:40:32 ] >>241 vtableの自前実装は、型消去かバイナリ互換が主な理由だと思う。 速度目的は聞いたことないなあ。
248 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 00:55:02 ] 自前vtableっていまいち使い道が不明だと思ってたんだけど、そういうところで使うのね
249 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 01:01:23 ] ああ、自前vtableで速度向上になるって話も思い出した。 どこだか忘れたけど、概要としては非ポリモーフィックに扱う限り 非仮想関数だから最適化されやすいという理屈。 今時のコンパイラなら、仮想関数でも多態的でない状況で使われることを 検出してやるなんて朝飯前だろうから、やっぱり速度目的で自前vtableにする理由はないな。
250 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 01:41:35 ] >>246 ::operator new()というのは、 要求されたメモリを確保して void*として返す関数。 (bad_allocを投げるmalloc()、と考えてよい) したがって、sizeof(Integer)のメモリを確保して それを(void*から)Integer*にキャストしてる。
251 名前:222 mailto:sage [2010/02/09(火) 08:05:12 ] うーん、通信のプログラム難しい・・・。 HttpOpenRequestやHttpSendRequestを使うと思うのですが、どうやればいいのかわからないです。 ブラウザでPukiWikiを開いてソースを見ても、これと同じ事をwininetでやるにはどうすればいいのかさっぱり・・・。 何か良いサンプルはないでしょうか?
252 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 10:25:13 ] そもそもHTTPはわかってるの?
253 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 11:43:02 ] >>252 軽く調べた程度の知識しかないです。
254 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 11:52:52 ] じゃあまずは簡単なCGIを自作して、そいつにPOSTするようなの書いてみては
255 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 12:58:56 ] サブクラスを普通に使いつつ、スーパークラスをインスタンス化を禁止する方法ってありますか?
256 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:06:01 ] virtual function-name() = 0
257 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:06:21 ] スーパークラスのコンストラクタをprivate/protectedにして実装を書かない って技があったと思う iostreamライブラリでも使われてるってEffectiveC++のどっかに書いてあった
258 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:10:25 ] 抽象クラスっていうんでしょうか? ただスーパークラスの関数はすべてvirtualながらも定義していて、 必要に応じてサブクラスで上書きしているので、純粋仮想関数は使えないです スーパークラスのデフォルトコンストラクタをprotectedにしてみました これはアリでしょうか?
259 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:12:07 ] >>257 リロードしてなかった・・・ いまその記事発見しました ありがとうございます
260 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:30:30 ] >>254 どうもです。 CGI作成の方を調べたら、だいぶ分かってきました。
261 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:33:30 ] codepad.org/TMxmPZN4 こういうやり方もあるようだが これは正しい方法なのかな? vc++とcodepadでは期待通りになる
262 名前:257 mailto:sage [2010/02/09(火) 14:08:02 ] むしろそれが普通のやり方だね 257は訂正、protectedにして(コピーコンストラクタや代入演算子を)実装しないってのは インスタンス化は許すけどコピーは出来ないようにする といった要求がある時に使う技だった
263 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 15:08:46 ] std::tr1::unordered_set<Foo> Fooはoperator std::size_tを定義していないとだめだと聞いたんですが これはいったいどんな値を返すべきなんでしょうか?
264 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 17:17:16 ] >>249 vc++ee2008で試したら仮想関数のほうが3倍速かったわ
265 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 17:39:16 ] >>263 たぶんハッシュ値
266 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 18:19:00 ] template <typename T> class Hoo : public T という使い方は可能なのでしょうか? 例えば template <typename T> class ExceptionEX : public T としてテンプレート引数を標準例外とし、任意の標準例外を継承して 通常のメッセージの他に 行番号__LINE__やファイル名__FILE__等の情報を含む汎用的な例外を作りたいと考えています。 最終的には #define divide_by_zero_error() ExceptionEX<std::logic_error>(/*追加情報+0で除算メッセージ*/) こんな形でマクロ定義で楽ができればな、と考えています こういう事は可能なのでしょうか?
267 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 18:26:01 ] CRTPで調べてみるといいかもよ
268 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 18:49:29 ] >>266 できるよ。
269 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 19:08:32 ] 指定したAというフォルダのなかに何が入ってるか 知る方法ってありますか
270 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 19:13:49 ] コンセプトさん早くこないかな
271 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 19:21:03 ] >>265 ありがとうございます
272 名前:デフォルトの名無しさん [2010/02/09(火) 20:00:13 ] 質問です 普段はVC++ 2008 Express Editionで開発しているのですが ふと別のコンパイラでコンパイルしたところ、エラーが出ました エラーの内容は「ここでは宣言は出来ない」という文章で4箇所 47,82,93.96行の場所です どうも構造体のポインタを宣言する事が引っかかっているようです ちなみに、VC++の方ではエラーは検出されませんでした 構造体へのポインタは、サイトをざっと見て試行錯誤しながらやったものなので 何かが間違っているのだろうとは思いますが、どの辺りかがよく分かりません どなたかご指摘お願いします ソースコードです↓ codepad.org/bPyH9hRl
273 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 20:03:29 ] C言語としてコンパイルするなら途中で変数の宣言は出来ない。関数の頭へ移動されればOK
274 名前:デフォルトの名無しさん [2010/02/09(火) 20:09:10 ] >>273 つまりそれぞれの宣言を、関数の一番先頭に持ってくればよいと言う事でしょうか? それはint型などの変数でも同じなのですか?
275 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 20:17:20 ] そうだよ
276 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 20:26:43 ] >>273 ,>>275 順序を変えてみたところ、素直にコンパイルしてくれました こんな些細なことでもエラーが出るとは思いませんでした ありがとうございました
277 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 20:40:17 ] >>276 > こんな些細なことでもエラーが出るとは思いませんでした C/C++ではそんなんしょっちゅうだよ。 ・・・まあコンパイルエラーが出ているウチは楽だよ。 実行時エラーが出ると発狂しそうになる。
278 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 20:54:45 ] >>269 あるよ
279 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 20:55:38 ] オブジェクトの比較は演算子をオーバーロードするのが一般的なのですか?
280 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 20:59:23 ] >>279 うん でも比較用の関数やファンクタを使うこともしばしばある
281 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 21:04:04 ] templeteってジェネリックってことで、おk?
282 名前:296 mailto:sage [2010/02/09(火) 21:06:55 ] >>278 どうすればできますか? また、その方法が紹介されているサイトとかあったら教えてください
283 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 21:09:04 ] >>282 環境別な方法(一般的)と、大抵の環境で出来る方法があるが、どっちがいい?
284 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 21:13:43 ] >>281 まあ表面的にはそう。
285 名前:281 mailto:sage [2010/02/09(火) 21:21:48 ] >>284 thx
286 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 21:24:06 BE:1620859469-2BP(0)] >>282 1. boost::filesystem 2. dirent.h 3. Win32 APIなどの環境別API 4. system("dir > temp"); 5. __asm { 中略 int 1bh }
287 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:00:41 ] #include <Hoge>としただけなのに、Hoge* h = new Hoge();とできるクラスには namespaceが設定されていないんですか?
288 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:20:01 ] #includeとクラスとnamespaceに何の関係が?
289 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:29:29 ] >>288 いまいわからないから、質問しているわけで
290 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:33:31 BE:960508984-2BP(0)] #define Hoge foo::HogeImpl namespace foo { class HogeImpl { }; } かもしれん
291 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:34:50 ] 基本的に指定しなければグロバールのネームスペースに所属させられる。 明示的にくくってやればおk。
292 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:38:41 ] >>289 #include は、そこに書いてある名前のファイル (この場合では Hoge) の内容を、 あたかも直接書いたかのように取り込むだけです 例えばファイル Hoge の中身が class Hoge {}; で、以下のソースコード #include <Hoge> int main(){ Hoge *h = new Hoge(); } をコンパイルした場合、この #include <Hoge> の部分がファイル Hoge の中身に置き換わって class Hoge {}; int main(){ Hoge *h = new Hoge(); } と書いたかのようにコンパイルされます ファイル Hoge に namespace が書いてあればそれは書いてあるように適用されるし、書いてなければ何もなしです
293 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:41:15 ] C++では、enum型を==で比較するのはダメなのでしょうか。
294 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:41:35 ] 別にダメくない
295 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:44:11 ] というか比較しまくる
296 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:48:20 BE:720382346-2BP(0)] 他にどうやって比較するのじゃ
297 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:49:04 ] 引き算
298 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:51:21 ] 多重定義
299 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:52:11 BE:480255528-2BP(0)] 2重switch
300 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 23:55:33 ] >>291-292 thx
301 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 00:07:33 ] あのーplacement new[]の使い方がいまいち解りません。 Hoge* h = new Hoge[100];っていうのを placement new[]でやるには、Hogeにどんなnewを定義すればいいでしょうか?
302 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 00:30:29 ] void *p = operator new(sizeof(Hoge)*100); Hoge *h = (Hoge *)(new (p) Hoge[100]); で大丈夫かな? コンパイルは通るはずだけど。 (当然、Hogeにはデフォルトコンストラクタが必要。 デフォルト引数がある引数を持つコンストラクタで可能かは知らない) ていうか、こうすると、 全部の要素に対して個々にデストラクタを呼び出してからメモリを解放するわけだし だったらコンストラクタだって、(placement newを使って)個々に呼び出すだけで良いじゃない、という話になる。 それだったら、引数の制限も無いしね。
303 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 00:32:59 ] placement newって実装に依存するって話を聞いたんだが正確な話ではどうなってんの?
304 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 00:34:48 ] えー? new[]が要素数をどこかに保存しているから実装依存、という話ではなくて?
305 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 00:38:33 ] homepage2.nifty.com/well/Operator.html ここの配置newのところに コンパイラによって動作が異なるという問題があり って書いてあるのが気になって
306 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 00:47:35 ] void *p = ::operator new(sizeof(Hoge)); Hoge *h = new (p) Hoge; // ここで普通にhを使う h->~Hoge(); ::operator delete(h); というコードは、どのコンパイラでも通るし正常に動くと思う。 (例外対応してない点を除けば) 普通のnew演算子とdelete演算子のやっていることを エミュレートしているだけだから。
307 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 01:11:53 ] >>302 それ危ない。領域が足りない可能性が高い。 安全にやる方法は、いまのところ実装に依存する方法(実際に試してみるとか)しかない。 www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#476
308 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 01:59:04 ] int main() { printf("xx"); } returnを書かなくてもエラーにも警告にもならないのですが、 これはC++の仕様なんでしょうか、それとも環境依存なのでしょうか。 VC++2008を使っています。
309 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 02:13:03 ] 仕様
310 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 09:22:17 ] using namespace とテンプレートの特殊化についてですが template<> class hoge<std::string> という特殊化を定義してて 使用者側がusing namespace std;を宣言していて hoge<string>とした場合呼ばれるクラスは汎用のものなのか特殊化された物なのかどちらになるのでしょうか
311 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 09:23:03 ] >>308 ttp://www.open-std.org/jtc1/sc22/wg21/ からたどれる current draft の 58、59頁には If control reaches the end of main without encountering a return statement, the effect is that of executing return 0; とある
312 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 11:52:32 ] クラスのメンバ関数はいつから使用可能なのでしょうか? コンストラクタの初期化子にメンバ関数の返り値をあてることは出来るのでしょうか?
313 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 12:15:13 ] >>312 コンストラクタでメソッドが利用するメンバを初期化してたりしなければ問題ない;
314 名前:デフォルトの名無しさん [2010/02/10(水) 14:02:13 ] Microsoft Visual C++ 2008 Express Edition SP1 のフォームアプリケーションでの質問です。 char配列若しくはwchar_t配列をテキストボックス(this->textBox1->Text)に表示したいのですが 単純に下のように代入しようと char str[256]; this->textBox1->Text = str; すると下のように出てしまいます。 理由: 'char *' から 'System::String ^' へは変換できません。 テキストボックスにchar配列の内容を表示する方法を勉強できるサイトを教えてください。 よろしくお願いします。
315 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 14:15:35 ] >>314 フォームだとC++の範疇じゃない、C++/CLIになる。 this->textBox1->Text = gcnew String(str); とかかな。 とにかく、C++のサイト探しても見つかりにくいよ、C++/CLIで
316 名前:デフォルトの名無しさん [2010/02/10(水) 14:17:43 ] >>315 本当にありがとうございます!! C++/CLIで検索しつつ精進します。
317 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 14:17:56 ] >>312 初期化子でthisを使うのは直接・間接を問わずバグの原因になりうる だから初期化子でthisやメンバ関数を使うのは避けるべき スコープに入ってからならthisやメンバも使っておk
318 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 14:35:09 ] >>313 >>317 大丈夫かも知れないけど変なバグの温床になりやすいと言うことでしょうか ならばstaticなメンバにすれば大丈夫なのでしょうか
319 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 14:48:45 ] 初期化子リストを使う段階ではオブジェクトが構築されてないのでthisが危険 初期化子リストは初期化される順番が決められていないので初期化順に依存するコードは危険 メンバ関数は基本的に構築が正確に済んでいるオブジェクトから呼び出されることを前提にしているから初期化子への代入目的には基本的には使えない staticメンバは問題無いので使っていい
320 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 16:09:31 ] vc2003+MFCのコンソールアプリについてですが、 入力待ち、処理中に閉じるボタンを押された際の処理方法を 教えてもらえないでしょうか。
321 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 18:28:27 ] >初期化子リストは初期化される順番が決められていないので初期化順に依存するコードは危険 メンバの初期化順はメンバ変数が定義された順と決まってるだろう。
322 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 18:30:04 ] あれちゃんと順番に書いてる奴いんの?めんどくさいんだけど
323 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 18:42:19 ] 危険 (キリッ を放置するのが楽しいんじゃないか余計な突っ込み入れるなよぅ
324 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 18:49:19 ] プログラマって性格悪いやつすごく多くね?
325 名前:デフォルトの名無しさん [2010/02/10(水) 18:57:01 ] 以下のプログラムで、shori内のa[][]の値をそっくりメインのdata[][]に渡すにはどうすればいいのかが分かりません。教えてください。グローバル変数にしないとだめですか? void shori() { int a[2][4]; a[1][1] = 10;//などと適当な処理 } int main() { int data[2][4]; shori(); return 0; }
326 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 18:59:31 ] void shori(int a[2][4]) { a[1][1] = 10; } int main() { int data[2][4]; shori(data); return 0; }
327 名前:デフォルトの名無しさん [2010/02/10(水) 21:01:50 ] >>326 解決しました ありがとうございます
328 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 21:24:52 ] #include <iostream> #include <fstream> #include <iterator> void cat(std::istream &s) { std::istreambuf_iterator<char> it = s, end; while(it != end) { std::cout << *it; ++it; } } int main(void) { std::ifstream s("Test.cpp"); cat(s); return 0; } EffectiveC++のサンプルコードではこういう感じでファイル名を渡す形ではなくそのままストリームを渡していました なぜこの形式を使うんでしょうか?ファイル名を渡すのと比べてどんな利点があるんでしょう?
329 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 21:28:29 BE:540287429-2BP(0)] ファイル以外にも使えるようにじゃないか
330 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 21:29:41 ] >>328 ストリームをfstreamからiostreamやstringstreamに置き換えても そのまま動くからじゃね?汎用化というか
331 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 21:37:35 ] Oh! ナルホド!
332 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 22:07:19 ] >>322 コンパイラによっては順番に書けやって怒られるぞ。
333 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 22:26:25 ] >310 string が std::string を指していて、かつ hoge<std::string> が可視なら特殊化されたものを使うだろ。 template だからって変なこと考える必要はないと思うよ。
334 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 22:30:57 ] 別のファイルでstd::stringを自分で定義してhoge<std::string>ってしたらどうなるの?
335 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 22:32:18 BE:1080572494-2BP(0)] std内に何かを追加した時点で 動作が保障されないんだっけ?
336 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 22:33:25 ] stdに追加していいのはテンプレートの特殊化だけだったような
337 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 22:36:57 ] >>332 > コンパイラによっては順番に書けやって怒られるぞ。 そんなクソコンパイラもあるのか。
338 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 22:39:51 ] > std内に何かを追加した時点で > 動作が保障されないんだっけ? そう。未定義の動作になる。 ただし特殊化を除く。 > stdに追加していいのはテンプレートの特殊化だけだったような その通り。
339 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 22:59:33 ] 定義したくらを class Hoge { .... } Hoge h[100]; ってやるとエラーになっちゃうんですけど h[100]って定義するためには何を自分のクラスに 記述すればいいのでしょうか。
340 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 23:02:32 ] デフォルトコンストラクタ
341 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 23:02:36 ] Hoge* h = new Hoge[100]; 配列形式はPODしか使えない おそらくコンストラクタを持っているのだろう
342 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 23:08:47 ] class Hoge { int i; public: void seti(int j) { i = j; } void printi() const { std::cout << i << std::endl; } } hoge[100]; int main() { for (int i = 0; i < 100; i++) hoge[i].seti(i); for (int i = 0; i < 100; i++) hoge[i].printi(); } 悪い、勘違いしていたようだ >>340 さんの言う通りデフォルトコンストラクタが抜けているんだろうな デフォルト引数などを使って解決する事もできる
343 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 14:56:12 ] DLLの中の人が使うための共有メモリがあるとします このメモリの確保・開放はDllMainでやるか、グローバルスマポでやるか どっちが安全でしょうか?
344 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 15:10:31 ] DLLの中の人次第
345 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 15:40:54 ] >>343 グローバル変数やDllMainは使わない方法を考えるべきだね。
346 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 17:20:02 ] エディタのCPad for bccを VisualC++のコンパイラに適応させるにはどうしたらいいですか? コンパイラの場所以外になにか設定が必要でしょうか?
347 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 17:31:28 ] >>346 普通はそんな使い方しない。 IDE使えばいいんじゃないかな??
348 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 17:42:06 ] >>347 IDEがちょっと重いのでエディタでと変えようとしてたんですが、無理ですかね?
349 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 17:49:19 ] >>348 一応、CL自体はコマンドラインから使えるようにはなってるはずだが、もうズーットつかってないなぁ。 >cl /help でヘルプが見れたので適時変換して使えるようにすればできるかも。 ただ、労力には見合わないと思う。
350 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 17:52:25 BE:1200636858-2BP(0)] プロジェクトを用意してdevenvがいいんじゃないか
351 名前:296 mailto:sage [2010/02/11(木) 17:56:53 ] たしかにVC++は重い(スタートメニューが)
352 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 17:58:15 ] 名前間違えた
353 名前:デフォルトの名無しさん [2010/02/11(木) 18:22:28 ] -lm でlibm.aをリンクするらしいですが、 じゃあ僕もlib?.aファイル作ってみたいです mingw32 gcc 4.4.1 Windows2000 SP4ですが どうやって生成するんですか?
354 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 19:31:27 ] ld使え
355 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 19:55:04 ] コンストラクにstd::bad_allocをつける 場合、宣言の部分にだけかけばいいのでしょうか。 誰かサンプル書いて
356 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 20:16:48 ] つーかコンストラクタがstd::bad_allocを投げる場合は大抵のOSでは 後処理も出来ない状態の事が多いな
357 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 21:05:47 ] 「bad_allocをつける」って意味がわからない。 例外指定のことだろうか。
358 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 21:42:47 ] >>356 じゃあ書かない方がいいのですね。 コンストラクタでメモリ確保とか何か重要な C++は言語の不備なのでしょうけど、失敗が ある場合放置するしかないのですよね?
359 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 21:47:28 ] bad_allocに限って言えばなにも考えずにmainでキャッチしてエラー通知して終了でいいと思う
360 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 21:48:06 ] >>358 メモリが足らないって、どの言語を使っていてもあるでしょ。
361 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 23:50:56 ] includeする時に、*.hが有るのと無いのがあるじゃん あれって何が違うの?
362 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 23:57:16 ] >>361 C の標準ヘッダは .h。 C++ の標準ヘッダは拡張子なし。 非標準ヘッダは適当。
363 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 23:58:00 ] ファイル名が違う #include は *.h でも *.txt でも *.hoge でもC言語の文法に合った内容のテキストファイルならなんでも #include できる
364 名前:361 mailto:sage [2010/02/12(金) 00:00:33 ] >>362-363 ありがとう。知らなかったよ
365 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 07:48:20 ] 便乗で ""と<>両方あるけどあれもあんまり意味はない?
366 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 09:02:22 ] ""だとカレントディレクトリを最初に検索 <>だとシステムのヘッダのみを検索
367 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 12:53:22 ] >>366 www.kijineko.co.jp/tech/superstitions/quoted-headername-is-searched-for-from-cwd.html
368 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 16:37:15 ] inlineにするときに、これはまず展開されねーなっていう場合ってどんなのがある? 確実にダメなのって関数ポインタを使ってる時ぐらいかな?
369 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 16:45:49 ] 関数ポインタって、それ仮想関数のことも当てはまるじゃん。
370 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 17:48:18 ] おまいら配置new/deleteって普段つこうとるの?
371 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:11:38 ] 特殊な状況でしか塚湾だろう。
372 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:37:22 ] C言語で、windows.hのSleep()ではないウエイトをかける方法ありませんか?
373 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:41:14 ] timeGetTimeを使う
374 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:49:39 ] FindFirstFileを使いたいんですけれど どうすれば使えるかがわかりません 何をどうすればいいのですか?
375 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:51:26 ] まずwinapiスレに行きます
376 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:53:04 ] 次に手を洗います
377 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:53:52 ] ググって出たソースをパクる
378 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:54:10 ] schiphol.2ch.net/gameurawaza/
379 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 18:54:53 ] 誤爆
380 名前:デフォルトの名無しさん [2010/02/12(金) 21:59:09 ] extern って、 #ifdef _MAIN_ int a, b, c; char d, e, f; struct _ST g, h, i; class _CL j, k, l; #else extern int a, b, c; extern char d, e, f; extern struct _ST g, h, i; extern class _CL j, k, l; #endif こういう風に使いますよね。 でも、これだと宣言と不便ですよね。 #ifndef _MAIN_ extern { #endif int a, b, c; char d, e, f; struct _ST g, h, i; class _CL j, k, l; #ifndef _MAIN_ } #endif こんな感じに一気に extern できないのでしょうか?
381 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 22:03:01 ] #ifdef MAIN #define EXTERN #else #define EXTERN extern #endif EXTERN int a, b, c;
382 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 22:07:25 ] >>381 うお、すげー! Thanks!
383 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 22:13:24 ] >>380-382 そんなウンコマクロが欲しくなるほどグローバル変数をばらまくんじゃねぇよ。 あと、インクルードガードに予約識別子使うな。
384 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 22:16:51 ] >>383 断る。
385 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 22:17:28 ] >>383 > 予約識別子 今知った。 指摘Thanks!
386 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 22:18:20 ] >>383 これみてるとC/C++って糞だよな
387 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 22:19:32 ] 何を今更。
388 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 22:34:27 ] int &a(void) { static int a; return a; } プロはどうしてもグローバル変数が欲しい時はこう書く 真似していいぞ
389 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 22:37:19 ] プロ・・・ クラスのメンバみたいにアクセスさせる形にすればいいだけなので クラスを扱う言語経験者なら思いつくと思うけど
390 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 23:01:57 ] オススメの命名規則(C++)を教えてください ハンガリアン記法は過去のものみたいなので
391 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 23:02:31 ] ドトネト式
392 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 23:08:16 ] perlのuse constantはそれと全く同等のことやってるな
393 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 23:19:49 ] FindFirstFile(path, &fd); でD:\下のファイルの情報取得で if(fd.dwFileAttributes!=0x00000002) { printf("%s\n", fd.〜) } としたんですけど D:\のSystem Volume Infomatonというフォルダが 条件から外れてくれません どうすれば隠しフォルダを避けることができますか?
394 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 23:22:21 ] >>393 ビットフラグじゃね?
395 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 23:23:21 ] >>390 www.possibility.com/Cpp/CppCodingStandard.html#descriptive
396 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 00:43:24 ] /* 個人データ */ typedef struct{ char name[100]; double height; double weight; }member; int main(void) { member *ma; int a=5; if ((ma = calloc(a, sizeof(member))) == NULL) { puts("calloc error"); exit(1); } カロックのところでエラーになるんだけどなんでかな?
397 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 00:50:09 ] >>396 ヒープが足りんのだろう。 戻り値の仕様ぐらい読め。
398 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 00:51:45 ] >>396 ライブラリを使うためのヘッダのインクルードが無い。 中括弧がいっこ足りない。
399 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 00:51:57 ] >>396 出ませんが ただ '}' が一つ抜けています
400 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 00:52:43 ] ああ #include <stdlib.h> が抜けてるとかいうオチ?
401 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 01:13:45 ] 返信はやっ! ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10523.c 全部はりつけてきました しゅくだい データは 2 TARO 170 64 ICHIRO 180 54 とかで入ってます 1行目に人数
402 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 01:21:38 ] 動かすの面倒なんでエラーメッセージ張ってくれ callocってヒープから取るんだろ doublex2 charx100(正確には101)とアライメント入れてもそれほど大きくないしなあ
403 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 01:26:35 ] >>401 fscanf() のエラーもチェックしろ。 calloc() のエラーとは関係ないだろうが、 "%lf" に渡す引数は double じゃなくて double* な。 やっぱりヘッダのインクルード足りないし。
404 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 01:38:26 ] >>403 しゅくだいなんだけど,ヘッダのとこは変更できないのよ・・・ ここに解答を書くってところだけ ヘッダのインクルードなしでどうすればできるかなぁ
405 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 01:40:59 ] >>404 動かすためにとりあえずヘッダ入れて 確認ができたらはずせばいい
406 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 01:48:47 ] コピー多いな 文字列へのポインタ持ってポインタソートした方がすっきりする
407 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 02:05:31 ] >>405 ヘッダ入れたらコンパイルできたけど,実行するとフリーズする・・・
408 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 02:44:46 ] >>403 fscanfのとこの&でしたorz ありがと(^ω^)
409 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 06:42:23 ] www.not-enough.org/abe/manual/ray-project/cc.html にあるレイトレーシングのソースコードをコンパイルしてみたのですがエラーが出てしまいます codepad.org/fErUOLbG どこをどうすればよいのでしょうか? お助けください。
410 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 13:12:43 ] >>409 codepad.org/m4SeoRfu 正しいかどうか知らんよ しかし基本的なC++文法エラーを犯しているなこの作者は
411 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 13:16:11 ] g++の拡張文法を使っているのかもしれない ポータビリティを考えるなら標準C++に従って書いた方がいいね
412 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 13:50:32 ] >>410 コンパイルしてちゃんとppmファイルを得ることが出来ました ありがとうございました!
413 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:05:09 ] 超初歩的な質問で恐縮なんですが CとC++ではCを先に学んだ方がいいんですか? それとおすすめのサイトとか書籍があったら教えてもらえませんか?
414 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:08:20 ] >>413 歴史をなぞるなら C から。 何か早く作りたいものがあるなら C++ からのほうが早いかもしれない。 ただし C に由来する落とし穴も多く残っているので、危ないかもしれない。 どっちからと考えずに、必要なときに必要な情報を確認しながら学ぶのが おすすめ。 お勧めサイト。 www.google.co.jp/
415 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:11:04 ] >>413 プログラミングしたことあるの?
416 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:11:48 ] C++入門といってもクラスやSTLは後半!とか続刊!とかの入門書なら 内容はCとかわらないよ。
417 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:15:19 ] あと面倒なのが最近はunicodeベースでコンパイルしちゃう物があるのに 古い標準関数はマルチバイトベースだったりととにかく古いだけあってめんどくさい>C/C++
418 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:15:25 ] >>414 特に急ぎ足では無く、ゆっくり学ぼうと思ってるんでCからいこうと思います。 ググるのは大切ですね、しかし紹介されてるサイトや書籍があまりにも多いので戸惑います。 >>415 すごい勢いでド素人です。
419 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:17:25 ] >>417 CとC++はわりと古いから、やり難い事があるという事だけわかりました!・
420 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:20:05 ] >>413 お勧め書籍。 www.stroustrup.com/Programming/
421 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:20:11 ] C++を学びたいならC++から Cも学びたいからCから C++をやるとCなんて馬鹿らしくてやってられないから
422 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:25:03 ] >>420 おぅふ・・・なんかすげぇのきた。これは理解できそうにない >>421 ++というだけあって発展形なんですね。
423 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:37:34 ] >>422 > ++というだけあって発展形なんですね。 今もC++はC言語のコードを(割と互換性があるので)使える。 でも厳密な互換性じゃないので使えないこともある。
424 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:38:41 ] >>418 windowsしか使わないなら、C#あたりからやった方がいいよ C/C++はなかなかソフトが完成しないから嫌になるし、初心者には難しい
425 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:43:20 ] >>424 > windowsしか使わないなら、C#あたりからやった方がいいよ いや、俺の意見としては C#だけは止めた方が良い。 > C/C++はなかなかソフトが完成しないから嫌になるし、初心者には難しい そんならP言語(Python, Pascal, PHP)をやれば良いと思う。 Rubyはよーしらんが。
426 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:43:29 ] >>423 なるほど!参考になります。 >>424 #ですか、比較的敷居が低いんでしょうか。 まずそれから弄るのもいいかもしれませんね、ありがとうございます。
427 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:45:23 ] qmakeとcmakeって何が違うわけ makeファイルを作っているだけなのか
428 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:46:22 ] まぁC#使っても、あれは出来ないだの、これはC経由しろだの、あるけどな。
429 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:47:41 ] C#使うくらいならJavaでいいじゃん
430 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:50:08 ] C, C++をやってから、GCのありがたみを感じるべき
431 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:51:47 ] >>428 API使えるしまあいろいろ方法はあるよ C#->C++に戻ってみるとC#で当たり前に使ってる部品がなくて自作することになったり 文字コード関連ではまるよりよっぽどいい
432 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:54:50 ] 昔の言語関連って無意味に省略しまくってるから直感で意味が通じないんだよな C->C#とC++すっとばして覚えたところでC++にいったけどさ c_strとかなんだよそれ
433 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:57:21 ] 好きなのを選ぶが良い ttp://vintage-digital.com/hefner/misc/lisp-programmers.jpg
434 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:58:17 ] 俺ロキュータスいくわ
435 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 17:58:37 ] >>433 怪しすぎるww 特にC++は何だこりゃw
436 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 18:00:01 ] >>432 仕方ねーんだよ 昔のリンカは識別子を最大6文字しか認識しない時代があって Cはその時に作られた物だから C++はとっくにその制限は撤廃されているがなぜかCの癖を無意味に 引きずって省略しまくっている タイプ量を減らすためか?
437 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 18:01:01 ] >>433 ASP.NETにいかざるをえない というか皆さん千差万別ですね、そりゃネットのおすすめの書籍も色々あるわけだ・・・ ここにテンプレがないのもそのせいか!
438 名前:デフォルトの名無しさん [2010/02/13(土) 18:03:32 ] >>436 まあギークが「ぼくのかんがえたさいきょうのげんごかくちょう」がC++だからタイプ量減らすためじゃね? std::stringのstringからcharに変換するやつね stringだからC++からの物だよね
439 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 18:04:57 ] Haskellやべえ
440 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 18:05:06 ] C++やるならQt Creator + VCのコンパイラがいいよ
441 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 18:17:54 ] >>426 いや、俺の意見としては C#だけは止めた方が良い。
442 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 18:18:13 ] >>440 メモっときます、ありがとう。 皆ありがとう。感謝します。 とりあえず色々触ってみた上で何か一つに絞って、学んでいこうと思う!
443 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 20:03:26 ] >>441 いやいや、C#は便利だぞ。 C++よりも綺麗だし。
444 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 20:46:45 ] >>443 そんなこと言ってまた不幸になる人を増やすのか! > C++よりも綺麗だし。 そんな言語いっぱいあるじゃないかw
445 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 21:45:41 ] >>444 C#で不幸になるやつは、もともと不幸なやつだけだ。
446 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 23:14:59 ] C#は.NETで出来ないことしようとすると、途端に不幸になる気がする。 MFCだと、のっけから不幸にだが・・・
447 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 23:27:06 ] ぶっちゃけCから始めるのがいいよ C99ならC++の便利なところは大体使えるし
448 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 00:06:35 ] Cを覚えてenumや構造体や関数で取り敢えずなんとか実用になるライブラリとか書く。 しかしC++でnamespaceやクラスを知ると、それまで書いたのを全部書き直したくなるんだよ。 で、書き直した頃にtemplateに手を出して、また書き直したくなるわけ。 その後もSTLやらEffectiveC++やらBoostやらにかぶれるたびに、今まで書いたものがゴミに見える。 さらにC++0.xなんてので、今また過去の糞化現象が起こるんです。
449 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 00:11:09 ] それを楽しめるマゾ向け
450 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 00:14:47 ] 最近はもう逆に余計なものみんな取り払って++も付かない99でもないCだけでいいんじゃないかと思えてきた
451 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 00:15:35 ] 99より前にもいくつかあるんだが
452 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 00:18:56 ] shop99 と shop100 だと500円の買い物で 5円とか半端な数字出る出ないの違いが有るよね
453 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 05:48:56 ] 入門書とかで「解説のためにわざと非効率なコード書いてます」とか出ると混乱するよな。
454 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 10:02:18 ] >>447 C99に完全準拠しているコンパイラはIntel C++などごく一部だけだぞ g++も部分準拠だし移植性がないしだいたいg++はC++0xへの改訂作業で 手一杯で今は時代遅れのC99に携わっている暇はないだろう
455 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 10:07:15 ] C++0xへの改訂作業なんて、 考えるだけで頭痛くなってくるなww
456 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 10:11:50 ] C99への準拠を強化するよかまだ0xに力入れた方がマシということ
457 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 10:11:59 ] でもnullptrとdecltype、auto、右辺値参照、コンテナの初期化子 など痒い所に手が届くようになるのはありがたいよな
458 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 11:36:08 ] 今までが届かなさすぎだったんだよ!
459 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 12:53:10 ] /usr/include/を見ていたら、*.hと*.cppがありました *.cppには#include "*.h"としか書いてありません 一体何がしたいんですか?
460 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 12:57:27 ] >>459 知るか。書いた奴に聞けよ。
461 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:00:38 ] イテレータから元の変数にアクセスできますか。 vector<int>::iterator p;だと、配列要素の値と位置がわかるだけ気がしますが pの前方に要素追加したり削除したりとか。
462 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:04:23 ] >>461 「元の変数」って何? vector インスタンスのことなら、無理。
463 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:06:31 ] サンクス
464 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:24:40 ] スタティックリンクライブラリ作成についての質問なんですが 1.C言語でも扱えるようにAPIの引数や戻り値部分だけあわせておけば 内部でC++で書いていようが問題はない? 2.スタティックリンクライブラリをコンパイルする際にスタティックリンクライブラリが 利用する外部の機能を取り込まないようにするにはどうすればいいですか? (VC++2008
465 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:33:30 ] 親クラスを継承して子クラスを作るときには、 子クラスのヘッダファイルにもオーバーライドするメソッドを、定義しないとダメなんですか? 一応自分でも試してみたんですが、コンパイラ様に怒られたので
466 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:35:30 ] >>465 そんなことはない。 エラーメッセージは?できればソースも出して。
467 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:36:57 ] 純粋仮想関数を持つ親クラスを継承した子クラスをインスタンスとして使おうとしたとか?
468 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:38:57 ] >>465 あとメソッドっていう用語は存在しないので、 今後はメンバ関数member functionと 呼ぶようにしなさいね。
469 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 15:42:06 ] >>464 1は、extern "C"もつければおk 2は、「取り込まない」の意味が微妙。 作ってるライブラリをAとして、 AはBというライブラリを使用しているとき、 AにBを含ませたくないという意味? 特殊なことしなければ「取り込まない」状態だと思う。 Aのプロジェクトの中にBのlibファイルを追加すれば 「取り込む」状態になるけど。
470 名前:465 mailto:sage [2010/02/14(日) 15:48:08 ] ひとまず、ヘッダファイルだけ晒します class Super{ public: Super(); virtual void print(); ~Super(); }; class Sub : public Super{ public: Sub(); void print(); ~Sub(); }; エラー ${HOME}/Test/sub.cpp:8: error: no ‘void Sub::print()’ member function declared in class ‘Sub’
471 名前:デフォルトの名無しさん [2010/02/14(日) 15:57:10 ] Visal C++ 2008 ExpレッsEditionでWindowsXP向けの開発です。 ウィンドウごとに音量を調整、若しくは開いているフラッシュオブジェクトの音量を調整する関数 または手法は無いでしょうか?
472 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:16:59 ] イテレータは挿入しても保たれるけど、end()とbegin()はそうでないのね。 不便。何でこんな事にしたの。
473 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:24:09 ] >>472 ??保たれない場合もあるだろ。何を言いたいのかよく分からんぞ。
474 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:28:15 ] そうなのか。気をつける。
475 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:41:04 ] 何が保たれるんだ?
476 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:42:04 ] *.cppに直接宣言している変数って何なんですか?
477 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:44:46 ] どんなコード?
478 名前:476 mailto:sage [2010/02/14(日) 16:48:30 ] >>477 こんなコードです DownloadManager *BrowserApplication::s_downloadManager = 0; HistoryManager *BrowserApplication::s_historyManager = 0; NetworkAccessManager *BrowserApplication::s_networkAccessManager = 0;
479 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:53:36 ] googleのコード検索で見たけど グローバル変数だね
480 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:57:51 ] prefix の s_ はstatic変数のsを表しているのかもしれない
481 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 16:58:43 ] >>478 staticのメンバ変数は、どっかに実体を宣言しないといけない。
482 名前:479 mailto:sage [2010/02/14(日) 17:01:50 ] そうだったw 479は間違い
483 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 17:04:26 ] boost::tuples or tuple の使い方が分かる日本語のサイトを教えてください。 名前空間が boost::tuplesなのかboost::tupleなのか、 色々混ざっているようなので ググっても謎です。 現行仕様のboost.タプルのの使い方が分かる日本語のサイトを教えてください。 よろしくお願い申し上げます。
484 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 17:05:53 ] アキラさんのboost本買うといいよ
485 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 17:18:10 ] テンプレート本?
486 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 17:41:35 ] >>483 boost.cppll.jp/HEAD/libs/tuple/doc/tuple_users_guide.html
487 名前:483 mailto:sage [2010/02/14(日) 17:49:05 ] >>486 お返事ありがとうございます。 拝読致します。
488 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 18:41:11 ] >>481 ありがとう
489 名前:デフォルトの名無しさん [2010/02/14(日) 19:06:37 ] C++なのですが 1行目 n個、2行目(n-1)個、・・・、n行目 1個の配列をつくるコードって これであっているのかどうかチェックしていただきたいのですが どうでしょう? --------------------------- int **a = new int*[N]; a[0] = new int[(int)(N * (N + 1) /2)]; int j = N; for(int i=1; i<N; i++){ a[i] = a[0] + i * (j-1); j--; } delete[] a[0]; delete[] a; ---------------------------
490 名前:デフォルトの名無しさん [2010/02/14(日) 19:10:50 ] CやC++を今から勉強したいんですけど、 全くの初心者ですがオススメの本ってありますか? 将来仕事にすることも考えてます。
491 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:14:57 ] >>490 独習シリーズ 本屋に行って、黄色い分厚い本を買って頭からケツまで20回嫁。
492 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:19:28 ] >>489 ありとあらゆる意味でダメ。 期待したとおりに動かないし、(直したとして)保守性も最悪。 窓からソースを投げ捨てるレベル。
493 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:20:11 ] ワロタw
494 名前:デフォルトの名無しさん [2010/02/14(日) 19:20:53 ] >>491 ありがとうございます 明日にでも買ってこようと思います
495 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:23:33 ] >>489 動くのかもしれんけどなんかおかしいような 普通はこんな感じじゃない? とかいって、普段vectorばっか使ってるから 初めてこういうコードを書いたわけだが int n=10; int **a=new int*[n]; for(int i=0;i<n;++i){ a[i]=new int[n-i]; for(int j=0;j<n-i;++j){a[i][j]=j;} } for(int i=0;i<n;++i){ for(int j=0;j<n-i;++j){ cout << a[i][j]; } cout << endl; } for(int i=0;i<n;++i) delete[] a[i]; delete[] a;
496 名前:デフォルトの名無しさん [2010/02/14(日) 20:15:00 ] >>495 ちなみにvectorだったらどんな感じになるんですか?
497 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 20:30:02 ] >>495 元のコードって、領域が配列を跨いで連続してる必要があるんじゃないの?
498 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:17:12 ] >>496 std::vector<int> a[N]; for (int i = 0; i < N; ++i) { a[i].resize(N - i); }
499 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:31:18 ] ポインタ配列は愚行でしょ struct C{size_t sz;int*p; C(size_t x):sz(x),p(new sz(int)){} C(size_t x,int*a):sz(x),p(a){}}; template<size_t N>struct L:C{ size_t am(size_t x){return x*N-((N+1)*N)/2;} L():C(am(N)){} C operator[](size_t x){return C(N-x+1,p+sz-am(x));}};
500 名前:デフォルトの名無しさん [2010/02/14(日) 21:37:35 ] >>497 そこが問題になるんですよね・・・ >>498 なるほど
501 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:41:14 ] 上でC99に準拠しているコンパイラが少ないって話が出ていたけど、 実際に試してみたら VC, gcc, bcc, dmc, OpenWatcom で全部ガン無視されててフイタwww むしろIntelの仕様がおかしいって言われそうで不憫だ。
502 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:45:10 ] gcc?
503 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:47:11 ] >>502 GNU C Compiler ですけど?
504 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:48:49 ] gnu compiler collection
505 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:53:13 ] gccじゃなくてg++じゃ、と>>502 は言いたかったに1ペリカね。
506 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:54:05 ] こまけぇことはいいんだよ
507 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:54:26 ] >>504 その略称のこともあるけど、GNU C Compilerの名前としてもgccは使われる。 >>502 お前人の揚げ足取ろうとする嫌な性格のやつなのね? そのくらい分かることだろ? さらに言えば今回の文脈ではg++じゃなくてgccが正しい。
508 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:56:51 ] gccで全然問題ない
509 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:05:20 ] >>502 がフルボッコw
510 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:06:32 ] 俺は502じゃないが、-std=c99つけてもあかんの あと関係ないけどGNU Compiler Collectionを指すときってGCCにするんじゃね
511 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:10:18 ] >>510 その略称のこともあるけど、GNU C Compilerの名前としてもgccは使われる。 さらに言えば今回の文脈ではg++じゃなくてgccが正しい。
512 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:11:56 ] >>510 > 俺は502じゃないが、-std=c99つけてもあかんの いやだれ一人としてダメなんて言ってないぞ?
513 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:12:37 ] >>499 大きな領域を一度に確保してからplacement newを発動するとか デストラクタが面倒臭い事になるけど
514 名前:507 mailto:sage [2010/02/14(日) 23:13:42 ] >>512 いや言ってるんじゃね?
515 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:13:48 ] GCCがC99ガン無視って事は無いな
516 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:14:45 ] どうみても>>499 は愚行だと思うんだが
517 名前:502 mailto:sage [2010/02/14(日) 23:19:43 ] 俺の疑問は>>510 の1行目が理由で>>515 なのではないかということ。 ok?
518 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:21:18 ] お前ら全員いい加減にしようぜ
519 名前:499 mailto:sage [2010/02/14(日) 23:21:22 ] うん。適当に打ち過ぎて矛盾やイミフメイな所がいっぱいあったんだ。気付いた処なおしたよ template<bool F=false>struct C{size_t sz;int*p; C(size_t x):sz(x),p(new int[sz]){} C(size_t x,int*a):sz(x),p(a){}}; typedef C<> E; template<size_t N>struct L:C{ size_t am(size_t x){return x*N-((N+1)*N)/2;} L():C<true>(am(N)){} E operator[](size_t x){return E(N-x+1,p+sz-am(x));}};
520 名前:483 mailto:sage [2010/02/14(日) 23:29:10 ] boost::tuple 勉強してきました。 感動しました。
521 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:30:29 ] > 広く使われている処理系でも、タプルのこの種の用途について > 最適化をしくじるものが存在する(例えば bcc 5.5.1) > ことに注意されたい。 Boostに名指しされとるww
522 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:32:42 ] まあ普通にstd::pairの拡張版だと捉えているがな
523 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:34:19 ] bcc 5.5.1は今から見るとひでぇからな。
524 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:35:47 ] 仕方ねえよ 標準C++にできるだけ準拠しようとして精一杯で 最適化まで手が回らなかったんだろ
525 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:49:33 ] >>519 何がしたいのかわからん。 new した領域はいつ delete されるの? なんで std::vector 使わないの?
526 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:52:14 ] テンプレートについて教えて下さい。 下記のようなテンプレートクラスを書いたところ コンパイルエラーになってしまいます。 template <class T> class TestClass { public: TestClass(){}; ~TestClass(){}; struct SS { int a; char b; long c; T d; }; SS * TestCode(void); }; template <class T> TestClass<T>::SS * TestClass<T>::TestCode(void) { return NULL; } gccでコンパイルすると、 error: expected constructor, destructor, or type conversion before '*' token error: expected `;' before '*' token となります。 どこが悪いのでしょうか。 教えて下さい。 宜しくお願いします。
527 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:57:10 ] >>526 typename
528 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:58:27 ] >>527 ありがとうございます。 何か追記する必要がありますでしょうか?
529 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:58:31 ] >>526 typename TestClass<T>::SS* TestClass<T>::TestCode(void)
530 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:59:46 ] >>529 ありがとうございます。 コンパイル通りました。 なぜ、先頭に typename と入れる必要があるのでしょうか? 教えて下さい。 宜しくお願いします。
531 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:01:57 ] >>530 ja.lmgtfy.com/?q=template+typename
532 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:05:55 ] >>531 ありがとうございました。
533 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:07:47 ] >>531 こんなサイトがあるんだw >これは、質問を自分で調べずに質問する人のために、Google検索の便利さを伝えるものです!
534 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 02:17:13 ] C++を勉強中の初心者です std::string Hoge(int Num) { std::string Data Data.clear(); 処理 return Data; } こういう関数があった場合Hoge関数の中で確保したstd::string Dataは C言語のころのmallocで確保された領域とどう違うのでしょうか? GCがあるような言語の場合参照が一定以下だと開放されるとかありますが C++はそういうのが無かったはずですし
535 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 02:22:07 ] Cでも構造体を返すことが出来るのは当然知ってるよな? で、当然、その構造体のメンバとして、 (mallocで確保した領域への)ポインタを持てることも知ってるよね?
536 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 02:24:17 ] >>534 mallocとか使って自分で管理するのと違って、クラスにその責任は任せてしまえる。 つまり、あんまり気にしなくていい。
537 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 02:24:26 ] >>535 はい std::stringで確保したデータが不要になった場合は clear()しておけば従来のfreeに相当する動作ということでいいんですかね?
538 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 02:34:49 ] ああ・・・いろいろ勘違いを・・・ テンプレートクラスということなので std::string* Data = new std::string(); stringの確保をこういう感じにしてこれを返せばいいんですね
539 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 08:06:25 ] >>538 ちがーう。 std::string をそのまま int か何かと思って同じように扱えばいい。
540 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 11:46:06 ] >>537 オブジェクト指向を根本的に勘違いしているな std::stringは一種のクラスであり、それ自体データとメンバ関数の 集まりとして完結しているものだ だから普通のPOD型の変数や構造体と同じように値返しが出来る 但しこれは当たり前だが、関数の中で定義したローカルstringを 参照返しするような事をすれば、これはstringに限らずどんなデータ型 だとしても未定義の動作となる
541 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 21:52:32 ] 回答側がバラバラすぎて、それぞれ何を主張してるのかよくわからん
542 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 21:53:01 ] >>538 C++初心者にオススメ。 ロベールの部屋 www7b.biglobe.ne.jp/~robe/ Codian www.kab-studio.biz/Programing/Codian/ 猫でもわかるプログラミング www.kumei.ne.jp/c_lang/ 少なくともこれぐらいは読んで 初めて質問が出来るレベルになるだろう と思います。
543 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:12:47 ] 素直にCから学べばよかったのに
544 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:14:20 ] Cから学ぶとC++の習得に余計な時間がかかるぜ
545 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:26:47 ] Javaだのを習得して、おかしな脳内回路ができるよりマシ
546 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:43:03 ] プログラミング経験皆無から始めるとして Cに3週、C++&STLに9週、テンプラ遊びの基礎に12週 これぐらいかかるかな
547 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:43:22 ] >>545 それはあるわ。Javaって結構綺麗な言語だから、 C++みたいな清濁併せ持ったカオスな言語だと 勉強がいやになってしまうんだよな。
548 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:46:21 ] >>546 あとたくさん本を買わなければならないよ C++について学べば学ぶほど、たくさんの本が必要になる 中には絶版になってしまったものもあって残念だが 俺は絶版扱いのC++標準ライブラリを一番多用している 手垢が付いてもう真っ黒だぞ
549 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 22:59:56 ] >>547 > Javaって結構綺麗な言語だから、 そうか? Javaも結局 謎の仕様を覚えなきゃならんことがあるし、 落ち目の感が否めない
550 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:02:30 ] >>549 謎仕様も多いけど、C++くんに言われとうないわ! まぁそうだな、綺麗だった、と言い直しとくわ。
551 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:11:28 ] 多くのプラットフォームで使えるC言語以上の 高級言語の内、 仕様が最も綺麗な言語って何だろう? 実際に役立つかとかはおいといて。 D言語かPython 3系(2系でなく)かな?
552 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:12:54 ] >>551 brainfuck とか whitespace とか
553 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:13:00 ] 後でできた言語の方が綺麗な構文になるのは仕方ないこと Javaはまあ綺麗になる前の踏み台みたいなポジションなのでしかたない しかしC#からC++に戻るとゲシュタルト崩壊?するわ C言語くらいまで戻るといろいろな面倒は自分で見ないといけないと 割り切ることができるけどC++のような中途半端だとスゲー悩む
554 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:17:12 ] ゲシュタルト崩壊 - Wikipedia ja.wikipedia.org/wiki/%E3%82%B2%E3%82%B7%E3%83%A5%E3%82%BF%E3%83%AB%E3%83%88%E5%B4%A9%E5%A3%8A
555 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 00:32:17 ] 教えて下さい。 テンプレートクラスから派生したクラスから、 基底クラスのメンバ関数をオーバーライド することは出来ないのでしょうか? なんどやってもエラーになってしまいます。 よろしくおねがいします。
556 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 00:35:27 ] codepadあたりにエラーになるコードを貼ってくれ
557 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 00:43:15 ] >>556 ありがとうございます。 template <class T> class A { public: A(){}; ~A(){}; struct S { long a; T b; }; S * TestFunc( S *p ); }; template <class T> typename A<T>::S * A<T>::TestFunc( S *p ){ return 0; } template <class T> class B : public A<T> { public: B(){}; ~B(){}; struct S : A<T>::S { double c; }; A<T>::S * TestFunc( A<T>::S *p ); }; template <class T> typename A<T>::S * B<T>::TestFunc( A<T>::S *p ){ return 1; } よろしくお願いします。
558 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 00:54:05 ] >>557 >>527- あと、ポインタ返す関数で return 1 は無いだろう。
559 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 01:10:51 ] >>558 ありがとうございます。 return 0; と return 1; を return p; に書き換えてコンパイルしてみました。 : error: expected `;' before '*' token : error: `typename A<T>::S*B<T>::TestFunc' is not a static member of `class B<T>' : error: template definition of non-template `typename A<T>::S*B<T>::TestFunc' : error: `p' was not declared in this scope : error: expected `;' before '{' token よろしくお願いします。
560 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 01:14:06 ] >>559 >>527- サルかお前は?
561 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 01:43:17 ] template <class T> class A { public: A(){}; ~A(){}; struct S { long a; T b; }; S* TestFunc( S *p ); }; template <class T> typename A<T>::S* A<T>::TestFunc( S* p ){ return 0; } template <class T> class B : public A<T> { public: B(){}; ~B(){}; struct S : A<T>::S { double c; }; S* TestFunc( S* p ); }; template <class T> typename B<T>::S* B<T>::TestFunc( S *p ){ return 0; }
562 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 01:01:13 ] >>561 ありがとうございました。
563 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 07:48:40 ] typename A<T>::S * TestFunc( typename A<T>::S *p );
564 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 10:43:57 ] テンプレートクラスを特殊化する場合 メンバ全てを宣言・実装し直さないといけないのでしょうか? それとも変更点のみで良いのでしょうか? あと、 template <typename T ,typename S = T> というデフォルト引数の設定は可能なのでしょうか?
565 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 11:03:13 ] >>564 クラステンプレートを特殊化したなら全部宣言しなおさないとダメでしょ。 クラステンプレートのメンバ関数ごとに特殊化できなかったっけ? > template <typename T ,typename S = T> やってみればいいじゃない。
566 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 13:25:55 ] デフォルトパラメータも使えたような気がしたが、こういうやり方もある template<class A, class B> class Base { --- }; template<class A, class B = hoge> struct DefType { typedef Base<A,B> type; }; { DefType<hoge>::type fuga; }
567 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 13:31:38 ] ごめん、間違えた template<class A> struct DefTypeA { typedef Base<A, nanika> type; };
568 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 14:04:17 ] テンプレート引数が異なるクラステンプレートの実体は関連が無いので、 同じクラステンプレートの異なる実体を継承することも出来る。 使いどころは限られるが。 template<typename T> class A { ... }; // デフォルト実装 template<> class A<int>: public A<...> // int以外を与えた場合のAを継承 { ... }; // 追加の実装
569 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:54:38 ] less を定義すれば greater とかも(特別な処理がない限り)自動で決まると思うのですが そういった処理(less がら greater を作製)をするテンプレートは標準であるのでしょうか? class CHoge { public: CHoge(int i, const std::string& str) : m_i(i), m_str(str){} int m_i; std::string m_str; struct Less { bool operator()(const CHoge& lh, const CHoge& rh) const { return lh.m_i < rh.m_i; } }; };
570 名前:569 mailto:sage [2010/02/17(水) 19:55:26 ] //こんなの template<typename T, typename FuncT> struct GeaterFromLess { bool operator()(const T& lh, const T& rh) const { return FuncT()(rh,lh); } }; std::vector<CHoge> vtHoge; vtHoge.push_back( CHoge( 4, "hoge" ) ); vtHoge.push_back( CHoge( 1, "foo" ) ); vtHoge.push_back( CHoge( 0, "bar" ) ); vtHoge.push_back( CHoge( 2, "alpha" ) ); vtHoge.push_back( CHoge( 3, "omega" ) ); vtHoge.push_back( CHoge( 1, "hotel" ) ); std::sort( vtHoge.begin(), vtHoge.end(), CHoge::Less() ); std::sort( vtHoge.begin(), vtHoge.end(), GeaterFromLess<CHoge,CHoge::Less>() ); // CHoge::Less() から Greator を作って逆順ソートしたい
571 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:31:44 ] >>569 標準ではなかった気がする 自分で作るかboost::operatorsだな
572 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:07:41 ] std::vector<class A> のpush_back() ってどんな動作してるんだ? たとえば vector<string> vec; vec.push_back("test"); ってやったら stringの何を呼び出してstringクラスに"test"を入れているんだ? 自作の文字列クラスをvecにつっこんで機能を使わせたいのです
573 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:13:46 ] コンストラクタ
574 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:44:09 ] STLを使うならEffectiveSTLには絶対に目を通しておけ
575 名前:572 mailto:sage [2010/02/18(木) 01:18:05 ] >>573 コンストラクタに(const char* )を追加して実行してみました. ttp://codepad.org/8ai16KPo どうやら大分ひどいことをしているようなんですが, コンパイルは通ってしまいます. ご指導をよろしくおねがいします. もしくは>>574 さんの勧める書籍を読めば何故こうなるのか理解出来るでしょうか?
576 名前:デフォルトの名無しさん [2010/02/18(木) 01:21:03 ] クロージャで出来て関数ポインタで出来ない例が思いつかない。
577 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 01:32:58 ] >>575 暗黙定義のコピーコンストラクタと代入演算子で浅いコピーになってる。 デストラクタを書くようなクラスではこの2つも必ず確認しなければいけない。
578 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 01:47:45 ] >>576 関ポじゃ状態を持てないじゃん
579 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 02:01:11 ] >>575 codepad.org/kAeUsq2i これでいいと思われます 要するにクラス内部でnew/deleteを行うような場合は 必ずコピーコンストラクタと代入演算子関数は自前で用意 しなければならないという事です そうしないとクラッシュしたり、メモリリークしたりします
580 名前:572 mailto:sage [2010/02/18(木) 02:59:22 ] >>579 >>577 ありがとうございます! コピーコンストラクタと代入演算子を作らないといけなかったんですね わかりやすくコードもひいてくださりありがとうございました
581 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 08:36:28 ] >>579 operator= の new で失敗するとゴミポインタ持ったままのインスタンスが残っちゃうよ。 delete の前のヌルチェックは要らないよ。(メッセージを分けたかったんなら別だけど) strlen() してから strcpy() するのってもったいないね。 date() じゃなくて data() だよね?(あ、 >575 から間違ってるのか。) こんなちっちゃいクラスでもこんだけ問題が出るんだから、やっぱり自作文字列クラス なんて作るもんじゃないね。みんなわかってると思うけど。
582 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 09:51:30 ] >>578 やっと理解した。Cというか関数ポインタだと代替にならないな。 でもこれC++ならクラスでやれって話になるな。
583 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 10:18:58 ] 乱暴に言うと、クラスはデータとそれに付随する振る舞いをまとめたもの。 クロージャは振る舞いとそれに付随するデータをまとめたもの。 ・・・っていうのはどの本の説明だったかな。
584 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 10:38:06 ] データ構造を決めれば操作は大体決まるから 俺にとっては前者のほうが自然に感じるが 一方、振る舞いだけでデータも記述できるんだよな 抽象データ型とかは操作ありき、だし object is a poor man's closure closure is a poor man's object
585 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 12:11:05 ] クロージャって要は関数オブジェクトみたいなもんでしょ?
586 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 12:45:33 ] >>581 >delete の前のヌルチェックは要らないよ。 デタラメ言うんじゃないよ 代入前に既に値が入ってたらどうするつもりだ それともtextが0だったらdeleteしても何も起きないというつもりか それだったら個人の自由だ プログラム上値が入っていたら消すんだよという意味を強調している それから >operator= の new で失敗するとゴミポインタ持ったままのインスタンスが残っちゃうよ。 文句言うなら自分でもっといいプログラム貼れや >strlen() してから strcpy() するのってもったいないね。 >date() じゃなくて data() だよね? 元のプログラムをそのまま使っただけだ 自分が1から書いたらもちろんこういう書き方はしない もう一度言う 文句あるなら自分で貼れ
587 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:20:25 ] >プログラム上値が入っていたら消すんだよという意味を強調している んなの強調して何の意味が。deleteなんだから消すに決まってる。 「値が入っていたら」はdeleteがやってくれる。
588 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:24:06 ] delete null 規格上は許されてるよ。 でもまあ、nullチェックしたほうが自然だろな。
589 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:29:38 ] そのnullチェックがそのコードで意味があってのことならやるが 機械的にチェックするだけ、という意味しかないのなら消すわ
590 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:34:14 ] if(p) Delete(p); void Delete(Obj *p) { if(p) _Delete(p); } void _Delete(Obj *p) { if(p) __Delete(p); } ・・・
591 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:45:25 ] 上の実装だと内部データ返せるから dateの戻り値をdeleteだって出来る(これは設計ミスだろう)。 そうなるとチェックせずにdeleteするのは「二重delete」で死ぬと思ったんだが ノーチェックで問題ないんかえ?
592 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:47:07 ] は?NULLチェックするに決まってるだろ んでdelete後にはNULL入れとけボケ
593 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 13:53:36 ] 俺は暗にあんたを擁護したんだが・・日本語勉強しる
594 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 14:05:06 ] ID出ないと誰が誰だか分からない まあとりあえずみんな落ちつけ
595 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 14:06:13 ] なんでID無しなんだろうな おかげで自演し放題だわ
596 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 14:44:11 ] ●持ちには隠しID丸見えだよ 自演はほどほどに
597 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 14:54:03 ] あちゃー、このスレ全部俺だったのバレてたか
598 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 14:58:48 ] いやいや、俺俺。
599 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 15:11:47 ] >>591 「deleteしたらNULL入れる」だけで二重deleteは防げる。 NULLチェックしたって二重deleteは全く防げない。
600 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 16:11:57 ] >>599 C++は規格票でもNULLより0が推奨されています
601 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 16:35:47 ] もう>>498 はいないだろうが n行m列のvectorの二次元配列の確保で vector<vector<int> > v(n,vector<int>(m)); こういう書き方って異端?
602 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 16:55:40 ] >>601 別に 三次元の場合もその書き方でよく書いてるけど
603 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 17:49:15 ] 異端じゃないけど効率悪いよ n*mサイズのベクタ一本とってインデクスは計算で出すほうがいい つーかC++は効率を良くしつつv[a][b][c]=1;みたいに書くことができないのが残念 せめて[a, b, c]とかでもいいからoperator定義できればよかったんだが
604 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:27:19 ] >>602 なるほど、了解 >>603 >n*mサイズのベクタ一本とってインデクスは計算で出すほうがいい 直感的にはループの中で剰余と割り算でインデックス計算したりするほうが 遅くなるように思うけど 領域が連続でないことでそんなに遅くなるもん?
605 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:30:37 ] >>604 連続でないってことは内部的に管理する仕組みが動いてるだろうから インデックスの増減ですぐにアクセスできるのとでは消費パワーが違うよ
606 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:58:58 ] (n, m)のインデックス算出に剰余と割り算使うのか? 普通はかけ算と足し算だと思うが
607 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:59:25 ] >>604 剰余も割り算も使わないよ v[siz1 * idx2 + idx1] 乗算と和だけ あとベクタのベクタはメモリに関するコストが増える
608 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 20:01:36 ] kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10537.c クイックソートを再帰なしに作ったんですが,なぜかソートされません・・・なぜorz
609 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 20:17:17 ] >>605-607 確かにorz 自分の勘違いも含めたベンチコード codepad.org/FTA8SWtA vectorにしたら結果が大きく変わるってことはないと思うんで 思ったほど差はない模様
610 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 20:52:26 ] >>608 まずpartitionがうまく動いてるか調べてみたら?
611 名前:569 mailto:sage [2010/02/18(木) 22:35:34 ] >>571 レスありがとう. boost::operators 調べてみたけど,クラスに operator を自動追加してくれるだけで 関数オブジェクトには利用できないのかな? ソート対象のメンバ変数ごとに Less の関数オブジェクト用意して, 逆順ソートする場合は Less の関数オブジェクトから Greater の関数オブジェクトを生成して ソートに利用する手法は良くやりそうだけど,自分で作るしかないか…
612 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:01:17 ] #if defined(Q_WS_MAC) 何これ?
613 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 00:34:01 ] #define TEST 5でマクロを定義し、char型の配列等に文字列TESTを代入すると、 "5"が判断されなくなってしまいます。 マクロを文字列に代入し、尚且つ置き換え後の値を取り出すにはどうしたらよいのでしょうか?
614 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 00:53:02 ] こんな感じの?? codepad.org/M0mcikaJ
615 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 00:54:44 ] 何かエラー出るな。 ttp://codepad.org/M0mcikaJ
616 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:02:39 ] #define TEST "5" じゃダメなん?
617 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:07:15 ] >>616 まったくダメなことはないけど、質問がよく解らんから普段使わない機能を使ってみた。。。vv
618 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:22:07 ] >>591 dateの戻り値をdeleteされる場合を考慮しはじめると、何をどうチェックしたところで無駄。 どうにもならない。
619 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:24:05 ] >>599 二重deleteを防ぎたいなら「deleteしたらNULL入れる」なんてせずに、 auto_ptr/vectorをはじめとするRAIIスタイルのライブラリを使ったほうがいい。 無駄なNULL代入が減る分、効率も向上する可能性が高い。
620 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:29:02 ] ご返答ありがとうございます。 試してみたけど駄目でした… やりたいことは、 #define TEST 5 … char * a = { "TEST" }; この変数aがどうやってもTESTという文字列でしか認識されず、5が出せないのです。 char型の配列にはヌル文字が付くからマクロとして認識されてないのでしょうか…?
621 名前:620 mailto:sage [2010/02/19(金) 01:37:42 ] 型がLPCTSTRの所で変数aを入れてるのが原因かなぁ
622 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:37:50 ] なんか>>616 でいいような気がするが。。。 文字列を結合したいならそういう関数を使う。sprintfとか
623 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:39:05 ] 情報の後出しは基本的にご法度だぜ。。。 ウインドウズ使っていいなら簡単な方法がある。ちょとコード書く。
624 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:39:47 ] む、LPCTSTR・・・・・とかhoge_sとか・・・ この辺の話はどうにかならんのかね・・・?
625 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:00:42 ] >>620 文字列リテラルの中はマクロ展 されない。
626 名前:620 mailto:sage [2010/02/19(金) 02:01:49 ] char型の配列使わずにint型の配列にTESTを入れて処理を進められました('A`) 大変ありがとうございました
627 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:05:03 ] #define TEST "5" … char * a = { TEST }; これでいいんでないの?
628 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:05:12 ] お前それで良いのか
629 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:06:09 ] おっと>>628 は>>626 向け
630 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:06:37 ] >>586 codepad.org/eoOEH0RH
631 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:11:36 ] >>620 #include "boost/preprocessor/stringize.hpp" #define TEST 5 char const* a = BOOST_PP_STRINGIZE(TEST);
632 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:13:03 ] 手を抜くつもりが黒魔術になってしまった。 後悔はしてるが反省はしていない。 #include <stdio.h> #include <locale.h> #include <tchar.h> #include <windows.h> #define TEST 5 #define BufSize 1024 int main(){ TCHAR BUF[BufSize]; _tsetlocale(LC_ALL, TEXT("Japanese")); /*wsprintf(BUF,TEXT("ほげほげ戦隊 ほげほげ%d"),TEST);*/ _sntprintf_s(BUF,BufSize,TEXT("ほげほげファイブ「%d」"),TEST); _tprintf(TEXT("%s"),BUF); return 0; }
633 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:23:19 ] >>610 なんかうちの環境が悪いだけでしたあざす
634 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:29:21 ] >>630 これってstaticにする意味って何? あおりじゃなくてただの素人です
635 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:30:09 ] 俺は文字列リテラル外すマクロが欲しい
636 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:35:19 ] >>635 文字コードすべて暗記してint型の配列を確保してエンディアン考慮して 文字を16進数にでもして並べていけばリテラルいらないよ
637 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:40:11 ] >>634 static にしないと引数として this ポインタが付く。無駄な引数は付けないのが当たり前。
638 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:44:40 ] リテラル嫌なら int a[2] = { 0x65676f68,0x00000000 }; printf("%s\n",(char*)&a[0]);
639 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:52:21 ] >>638 で、そう書く利点は?
640 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:53:55 ] 無いよ リテラルがいやとかぬかすから書いただけ わざわざこんなめんどくさい書き方しなくてもいいようにC言語なりに考えられてるのに いやとかぬかすからねえ
641 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:56:11 ] 表示サンプルがhogeだったからまずかったのかね?
642 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:05:36 ] >>637 private な static メンバ関数ってそういう目的があるんすね ありがとうございます
643 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:07:01 ] 文字列リテラルを勝手に外部化して後付けで差し替え可能なリソースを作ってくれるプリプロセッサを所望してるんだよな
644 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:10:34 ] >>643 いいたいことがイマイチよくわからんがエスパー的ひらめきだと VC++のメニュー関連のリソースが浮かんだ しかも手書きでやらないといけないというのを・・・
645 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:12:21 ] >>640 誰も嫌とはいってなくね?
646 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:13:55 ] おまけにVCのリソースを標準関数に喰わせようとすると無茶苦茶大変だし。
647 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:15:07 ] vsくらいになるとsettingとかあるんだけどな 勝手にxml読み込んだり書き出したりしてくれる機能があってそこへ 文字とかいれておけば呼び出せたりするんだが
648 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 03:24:32 ] 文字列リテラル外部化って今でもできるんじゃね? 文字列リテラルだけ書き込みヘッダ用意してそこへ入れておけば・・・ そういうのとは違うのか?
649 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 07:23:21 ] >>613 解決しちゃったの? こういう話だと思ったんだけど。 #include <stdio.h> #define TEST 5 #define TO_STRING2(s) #s #define TO_STRING(s) TO_STRING2(s) int main() { const char *p = TO_STRING(TEST); puts(p); }
650 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 07:29:54 ] メモリの大きさがそれほど無い組み込み環境化だとC++って使われるんだろうか std::stringとかの動作を考えてみてもすげー細かいレベルでメモリが断片化しそうなんだが
651 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 07:35:09 ] >環境化 環境下
652 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 08:21:59 ] >>650 相応にメモリの使用量や動的確保のタイミングに注意を払えばいいだけのこと。 C++ はそういう環境でも使えるようにできている。
653 名前:620 mailto:sage [2010/02/19(金) 12:18:39 ] >>625 >>627 >>631 >>632 >>649 マクロ展開できてなかったのですか… 632と649にある方法を試したところ、ちゃんとマクロとして認識され、5が表示できました。 boost入れてなかったんで631にある方法は試せなかったのですが、boostを利用する方法もあったんですね。 今後も似たような場面に出くわす可能性が高いので、提示されたサンプルはメモらせてもらいます。 ありがとうございました。