1 名前:v(^・^)v mailto:sage [2010/02/13(土) 23:18:03 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part77 pc12.2ch.net/test/read.cgi/tech/1263556932/
263 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 17:57:01 ] 継続での脱出みたいなことってC++で出来ますか? たとえばこんな関数があったときに、どこかでret=trueになったら 一番最初にfを呼び出した箇所へ飛んで関数を終わらせたい bool f(){ bool ret=false; //処理によってret=trueになったりならなかったり for(int i=0;i<n;++i){ret|=f();} return ret; } gotoで抜けられるのは今いる関数内のループだけだと思うので無理?
264 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 18:00:50 ] >>263 無理です。
265 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 18:07:53 ] >>263 たとえば、例外的なことがおきたときにプログラムの実行を中断したいというのであれば、 例外が使える。 だけど、例外は例外的な事以外に乱用すると非常に見通しの悪いプログラムになるから注意。
266 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 20:34:56 ] >>263 bool f(){ //処理によってret=trueになったりならなかったり for(int i=0;i<n;++i){if(f())return true;} return false; }
267 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 23:19:09 ] makeって使ったことがないのですが、 勉強した方がいいのでしょうか。
268 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 23:24:24 ] いい
269 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 23:25:15 ] IDEに任せっきりでmakeってのから逃げまくっていたのですが、 やっぱり勉強します。 ありがとうございます。
270 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 00:14:10 ] tbbを実用で使い出したけど、メモリ関係の例外が出まくるぞ。 いつもではなくたまに。どうみてもエラーになり得ないところで例外。 そのためにtbb_allocがついているのか。 メモリ管理をtbb専用で全部置き換えれば直るんですか。
271 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 00:29:16 ] >270 >いつもではなくたまに。どうみてもエラーになり得ないところで例外。 使い方が間違ってて排他処理で失敗してるだけじゃないの?
272 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 00:49:38 ] そうか。試しに全書き換えでやってみる。
273 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 01:16:49 ] #define allocator scalable_allocator とやると、 std::allocator がstd::scalable_allocatorになる。 std::allocator がtbb::scalable_allocatorにはどすればいい。 ::がdefineにかけない。
274 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 01:19:09 ] #define std tbbにしたらエラーでまくり。当然全関数対応しているわけはなく。
275 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 01:33:30 ] namespace std { typedef xxx::myallocator myallocator; } #define allocator myallocator
276 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 01:47:52 ] できないです template<typename T> class scalable_allocator; となっていて、テンプレート引数が必要と出ます
277 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 01:53:11 ] 単純なdefineの文字置き換えで出来ないかと考え中。 stdをstd0に書き換えて、tbbをstdにして、ここでヘッダを読み込み std0をstdに戻せば、善さげなきはする。 別名で存在している関数をdefineで置き換えたらいけそう
278 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:06:20 ] 駄目だった 再定義とか出る
279 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:08:02 ] バグの温床になりそうだな
280 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:25:01 ] 悪夢だ・・・
281 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:26:17 ] アロケータの置き換えはTBBのチュートリアルにやり方が書いてある
282 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:44:48 ] 面倒になってきたので標準装備のみで0から作るぜ
283 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:57:58 ] std::vector<int, tbb::scalable_allocator<int> >などとその都度指定する、 それをtypedefするというのは駄目なの?正統派だと思うのだけど。 C++0xなら template<typename T> using vector_tbb<T> = std::vector<tbb::scalable_allocator<T>>; と書いて、vector_tbb<int>とかvector_tbb<std::string>とか書けるようになるんだけど、 まだ未来の話……。
284 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 06:26:39 ] if文で真偽値を評価すると真になる要素がいくつあるか数えるのを短く書きたいです。 vector<int> a; // ;;;;;;; int n = 0; for(int i = 0; i < a.size(); ++i) if( a[i] ) n++; これを、 int n = std::count( a.begin(), a.end(), ?? ); ぐらいに短く書きたいのですが、なにかいい方法あります
285 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 06:30:24 ] ファンクタ使えば?
286 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 06:37:40 ] int n = a.size() - std::count(a.begin(),a.end(),0);
287 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 07:02:32 ] みなさまありがとうございます。 >>285 クラスを定義しようとすると、結局長くなってしまいますし、離れた場所に書くことになるため気に入りません。 >>286 それが良いですね。勉強になりました。 intの場合はそれでいいのですが、もうすこし一般化して、 if( a[i] >= 0 ) の場合などにも使える方法はありますか?
288 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 08:10:08 ] >>287 関数内クラス boost::lambda c+0x lambda関数
289 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 08:49:16 ] >>287 count_if(a.begin(), a.end(), bind2nd(not_equal_to<int>(), 0)) みたいなのをちょっとずつ変えれば
290 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 12:20:46 ] トークン結合演算子##を利用して どうにかならんかね?
291 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 18:00:32 ] 関数内にしかスコープのない関数って作れる? void foo(){ std::cout << "foo\n"; } の中で void foo(){ void bar(){std::cout << "bar\n";} bar();bar();bar();bar(); std::cout << "foo\n"; } こんな風に。 普通に考えてC++では違反だと思うのだが、 どうにか回避するトリックとか。
292 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 18:03:15 ] >>291 ローカルクラスを使う。 ttp://www.fides.dti.ne.jp/~oka-t/cpplab-tips-1.html
293 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 22:27:52 ] ローカルクラスは結構便利なんだけどなぜかあまり浸透してないよね
294 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 22:37:37 ] だってtemplateで外部にクラス渡せないし
295 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:05:50 ] 名前空間やモジュールシステムを持たないJavaScriptのような言語ならともかく C++ではあまり必要性がないと思う。ローカルクラスや関数内関数 クロージャはまた別だけど
296 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:08:02 ] ローカルクラスはtemplate引数も使えない。 あと0xでlambdaの型が外部に渡せるのに未だ渡せないローカルクラスは生きている意味があるのかと問いたい。
297 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:13:18 ] fainalなクラスとか? ローカルクラスにできて他にできないことって特にないよなぁ ローカルのほうが散らかさないで書ける場合はあるけど
298 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:17:58 ] 「外部に渡せる」の意味がわからん
299 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:18:33 ] ローカルクラスは昔使ってたけど、関数が大きくなって読みにくくなるんで匿名名前空間に置くようになった。
300 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:27:08 ] ローカルクラスはデストラクタで自動でリソース解放するのにたまに使ったり。 (=スマートポインタのデリーターみたいな感じ。) それとC++0xからはテンプレート引数に渡せるようになるね。
301 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:29:21 ] × デリーター ○ カスタムデリーター です。
302 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:35:29 ] 無名の名前空間だとヘッダに書かないといけないテンプレートクラスに使えないね
303 名前:291 mailto:sage [2010/02/22(月) 00:16:05 ] >>292 ありがとうございます。
304 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 00:49:41 ] std::string str[] = { "A", "B" }; これってバグの元になる? int i = sizeof(str) / sizeof(str[0]); こうするときとかに。
305 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 00:52:44 ] 動的配列であってもその実体は内部にelementのpointerを持っているだけなので 中身のデータが違ってもインスタンスの大きさはそれぞれ同じ。
306 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 00:54:13 ] >>305 即レスかつわかりやすい説明ありがとうございます。 不安がなくなりました。
307 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 00:58:51 ] C99で絶望するがよい。
308 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 01:01:14 ] 素直にvector<string>使いなよ。
309 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 01:03:48 ] >>304-306 何を心配してたのかわかんない。少し解説してもらえるとうれしい。
310 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 01:08:08 ] std::string a = "asdf", b = "9999999999999999999999999999999"; って文字列の長さが違うからsizeof(a)とsizeof(b)で同じ数値になるの!? std::stringで配列作っていいの!?!?!??!?!!!???わかんないです><;;;;; → のーぷろぶれむ
311 名前:304 mailto:sage [2010/02/22(月) 01:15:14 ] >>310 ありがとう。 その通りでした。 >>308 あとあと編集しづらいかな見にくいかなと思ったので。
312 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 01:47:53 ] クラス内にstatic constのint値を定義して, #defineの代わりにしたいんですが, このint値はそのクラスのインスタンスを生成してなくても, メモリ上に存在するのでしょうか? そうなると,大規模開発では避けるべきなのでしょうか?
313 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 01:51:08 ] #defineされた値だとプログラム全体の最適化がされない限り書く度に別々のところに数値が配置されるけどね。
314 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 02:00:33 ] グローバル変数ってlibファイルで共有? モジュールで共有?
315 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 17:47:17 ] >>312 最適化すりゃどうせ消える
316 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 21:00:22 ] >>312 まあ理屈はそうだけども、 現実的にはその最適化がなされないような状況は 明示的にコンパイルオプションで止めろ! と言わない限りおこんなinじゃない?
317 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 21:40:04 ] staticなんだからインスタンスは関係ないんじゃ
318 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 21:56:37 ] templateクラスのstatic変数ならあるいは
319 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 22:40:59 ] hiphopのwindows binaryありますか。phpコードをc++に書き換え、phpから利用できるようになるようなんですが。 ソースコード。 github.com/facebook/hiphop-php
320 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 01:04:04 ] 来月出版の C++テンプレートメタプログラミング 糞本かな? えぴなんとかさんの書いた類の糞本レベル?
321 名前:デフォルトの名無しさん [2010/02/23(火) 05:41:33 ] 禿本の邦訳にも係わってる人だよ
322 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 12:14:03 ] えぴなんとかさんってすごいのかどうかよくわからん 昔の掲示板ログとか見るととんちんかんな感じだよね えぴなんとかさんが初心者だったころなのかもしれないけど
323 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 18:19:02 ] これのことかな episteme.wankuma.com/stlprog/index.html
324 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 18:48:30 ] わんくま同盟ってなんか気持ち悪いよね 公開しているドキュメントでお世話になってはいるけど、近づきたくない感じ
325 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 19:14:15 ] 気持ち悪いというあいまいで感覚的な概念が気持ち悪い
326 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 19:41:10 ] 単に偉そうでむかつくんだろ
327 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 19:47:58 ] 「気持ち悪い」のはともかく、「よね」が意味わからん
328 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 20:52:33 ] 内輪ネタを表に出したがるあたりと偉そうなのはむかつくが同意は求めない
329 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 00:19:05 ] えぴなんとかさんって インなんとかさんみたいなもんか?
330 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 00:42:06 ] ペンネームに機種依存文字を使うプログラマの人って…
331 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 00:50:37 ] ビル☆ゲイツの悪口はそこまでだ
332 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 01:07:23 ] C++学ぶのにいい本ありませんか?
333 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 01:08:02 ] >>332 >>4-5
334 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 01:11:44 ] >>330 今チェックしたんだけど 機種依存文字じゃなかったぞ
335 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 06:51:15 ] >>332 こいつはマルチポストだから相手にしないように!
336 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 18:30:19 ] 単項演算子-のオーバーロードについて質問があります。 独習C++という本で勉強しているのですが、以下のようなサンプルコードがあります。(※一部省略) class coord{ int x,y; public: coord(){x=0;y=0;} coord operator-(coord ob2);//2項負符号 coord operator-();//単項負符号 }; //単項-をcoordクラスに対してオーバーロードする coord coord::operator-(){ x=-x; y=-y; return *this; } 上記の場合、 coord ob1; coord ob2; ob2=-ob1; としただけで、ob1の内容が変わってしまうと思うのですが、 このサンプルコードは正しいのでしょうか? 以下のほうがいいと思うのですが。 //単項-をcoordクラスに対してオーバーロードする coord coord::operator-() { coord temp; temp.x=-x; temp.y=-y; return temp; }
337 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 18:33:57 ] 俺もそのほうが良いと思う 一般に組み込み型と同じ挙動になるようにデザインするほうが良いと EffectiveC++にも書いてあるし
338 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 18:40:12 ] そしてconstを付けるべき
339 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 19:21:48 ] >>336 君の意見は正しい。 coord coord::operator-()const; とすれば納得できると思う。
340 名前:336 mailto:sage [2010/02/24(水) 19:57:51 ] >337-339 ありがとうございました。 これで先に進めます。
341 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:20:04 ] ん *thisを返すからいいんじゃないの?
342 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:23:33 ] this->xが変わるからダメなんじゃないの
343 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:28:54 ] プログラムに致命的なエラーがあり (取り扱えない例外をキャッチしたなど。) そこで即座に終了したい場合、 assert(0); exit(1); のどちらが望ましいのでしょうか? また、この2つにはどんな違いがあるのでしょうか? よろしくお願い申し上げます。
344 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:33:31 ] >>342 ああ、すまない。ぼけてたorz もう寝る…
345 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:42:17 ] >>343 assertは、ここでこうなってるはずがない、というプログラマの意思表示 んで、それはリリースビルドだとなくなるロジック
346 名前:デフォルトの名無しさん [2010/02/24(水) 23:59:19 ] インターフェースと実装を分離したいと思ってて、pImplイディオムを利用しようと考えています。 一般的なpImplイディオムは、コンストラクタでimpクラスをnewしていますが、 いま設計しているpImplを利用したクラスは、何度もインスタンス化されるので、newしたくありません。 また、Factory関数を作って、利用者側にわざわざ呼ばせたくありません。 つまり、クラスの利用者から、実装クラスを隠蔽し、かつインスタンス化時に何度もnewしないような方法はありますでしょうか? (妥協して、メンバ変数だけインターフェース部に持ってきて、実装クラスをSingletonにする、など考えてみましたが、案の定イマイチでした)
347 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 00:22:00 ] 一つ一つ中身が違うならプールして再利用ぐらいしか思い付かないなぁ
348 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:11:41 ] >>343 その用途だと abort() あるいは terminate() が正解だと思う。 assert() と exit() 含めて、それぞれの違いはライブラリのドキュメント読んでね。
349 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:14:23 ] >>346 new したくないっていうのは動的メモリ確保のコストを嫌っての話だよね? そういうことなら、外側のクラスに char impl_storage[max_size] みたいな領域だけ 置いといて、実装クラスでは new (impl_storage) impl(....) すればいいかもしれない。
350 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:16:15 ] >>346 dlmallocなんて単純だからすぐ作れるし 自分でmalloc作ればいいよ
351 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:20:56 ] >>346 まず、ふつうに new する状態でパフォーマンスに問題があって、次にそのボトルネックが new にあるという確認を済ませ、さらに >350 の言うように dlmalloc などによる高速化を試みた後、 それでも問題が残るようなら >349 のような奇怪なコードを、十分なコメントを添えたうえであれば、 書いても良い。 それ以外は許さん。
352 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:51:00 ] >346 実装インスタンスのnewコストを気にするんだったら、不要になったら再利用できるように簡単なGC作ったら? 実装インスタンス自体は利用者から見えないから、別にFactory関数で管理しても問題ないだろうし。 お手軽に実装するんだったらboost::shared_ptr + deleterかね。
353 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 02:01:58 ] >>343 assertは開発作業中のマーキングや「しおり」のようなものだと考えたほうがいいと思う。 exitはatexitの登録関数やストリームI/Oの後始末をしてから終了する。 C用の例外の代替物と見るべきで、C++では使わないだろう。デストラクタは実行されないし。 terminate(abort)なら後始末もせずに割り込みを掛けて即座に終了するが、 そこまでしたい状況は考えにくい。 結局、例外をそのまま放っておいてmainでキャッチしてreturn 1;とかするのが 常道だと思う。
354 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 02:05:19 ] >>343 取り扱えない例外ははじめからキャッチするなよ。 万一そんな状況がやむを得ないとすれば、 throw; で外に向けて投げとけばいいよ。 そうすれば勝手に terminate() するかもしれないし、誰かがキャッチしてくれるかもしれない。
355 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 03:30:24 ] enum型を引数に持つときって参照渡しにした方がいいの? 構造体とは違うっぽいのでしなくてもいい?速度的に
356 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 03:38:12 ] >>355 速度が気になるなら計測してみるがいい。 参照渡しがよくあるポインタと同様の実装だと考えると、 enum のサイズがポインタより 大きくなることはなさそうで、あまりメリットはなさそうな感じではある。
357 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 03:54:59 ] >>351 配置newって嫌われ者なの?
358 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 05:48:41 ] >>355 列挙型の実態が整数"ではない”実装を見たことがない。
359 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 09:35:37 ] >>357 別に配置newは嫌いじゃないですが、必要ないところで使うような人は嫌いです。
360 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 10:53:34 ] 誰もつっこまないけどchar impl_storage[max_size]なんてしたらアライメントどうするんだよ。
361 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 10:55:15 ] >>360 boost::aligned_storage あたりでおきかえる。
362 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 11:33:04 ] じゃあ最初からboost::aligned_storageって書けよ
363 名前:349 mailto:sage [2010/02/25(木) 12:07:15 ] >>362 boost::aligned_storage は標準ライブラリでもないし、コンパイラの拡張機能で指定した ほうがいいかもしれないし、その場で適当な union 作ってしのぐのがいいかもしれないし、 そんな気持ちを込めて「〜みたいな領域」と書きました。
364 名前:343 mailto:sage [2010/02/25(木) 12:49:32 ] >>345 >>348 >>353-354 ありがとうございます。 assert() exit() terminate() abort() について勉強してきます。
365 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 17:02:41 ] >>363 >そんな気持ちを込めて「〜みたいな領域」と書きました。 どう考えてもそれだけの情報からその気持ちは伝わらないから。 頭大丈夫?日本語分かる?精神鑑定してもらったら?
366 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 20:49:40 ] 解析で使う A-Z a-z 0-9 1 1 2 3 2 1 2 3 3 4 な表ってなんて名前だっけ?
367 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 20:57:50 ] >>366 LR解析表なのか?状態複数あって LR衝突してないのか?
368 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 21:03:59 ] >>367 表の中は説明で適当に書いただで意味はないんだ。 どんな名前だったか忘れてしまったもんで。 助かったよ。ありがとう
369 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 22:34:38 ] >>365 俺には伝わっていたが、伝わらない人がいるのもわかる。 そして、伝わらなかったからといってそのようなレスをするあなたが心配です。
370 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 13:26:29 ] 一般に、 g++ -lhoge test.cpp という調子でライブラリを読み込んで成功したとき、 hogeの場所を知るコマンドってありますか? 具体的には g++ -llapack test.cpp なのですが、これは Fortranのライブラリをリンクしているそうです。 Fortranでは DSYEV という関数名なのがC系だと dsyev_ と、アンダーバーがつくようになるというのがよく分からないので・・・。
371 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 14:38:16 ] よくわからんが、場所っていうのはディレクトリ名じゃなくて関数名のことかい それにOS依存の話題だったら微妙にスレ違いだぜ
372 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 15:45:41 ] LD_LIBRARY_PATHとか
373 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 15:47:09 ] ・リンカが検索に用いるパスを探すことで場所を知ることができる ・ラッピングした際に小文字にしたんでしょう
374 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 16:06:37 ] >>370 www.netlib.org/clapack/faq.html As previously stated, the CLAPACK library was built using a Fortran to C conversion utility called f2c. The entire Fortran 77 LAPACK library is run through f2c to obtain C code, and then modified to improve readability. CLAPACK's goal is to provide LAPACK for someone who does not have access to a Fortran compiler. It is important to note that this f2c conversion was run on a machine that appends an underscore to differentiate C and Fortran 77 namespaces. If your machine does not append an underscore to differentiate namespaces, then CLAPACK will not work on your machine.
375 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 17:11:46 ] ありがとうございます。 だんだん事情が分かってきました。 人間がCに移植しているわけではないのですね。 clapack.h をみても、単に宣言が書いてあるだけなので、 Cのソースコードとしてincludeするわけでもないのか。 あと前半はたしかにOS依存の話ですね。 手元の環境ではLD_LIBRARY_PATHも空だったし。 すみませんでした。
376 名前:デフォルトの名無しさん [2010/02/26(金) 20:04:26 ] /*******************************************************/ #define MAX(x,y) ((x)>(y) ? (x):(y)) int a = 3; int b = 3; int m = MAX(a,++b); はプリプロセッサによって int a = 3; int b = 3; int m = ((a)>(++b) ? (a):(++b)); と展開されます。 結果的に++bが2度評価され、bとmは5になってしまいます。 /*******************************************************/ という記述を見たのですが、標準C++の規格ではbとmは5になるってのは保証されますか? 私には未定義の動作になりそうに見えるのですが。 よろしくお願いします。
377 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:07:07 ] 保証されますよ
378 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:25:05 ] >>377 int m =++b, a , ++b; の場合はどうなりますか? bとmが5になりますか? それとも未定義の動作でしょうか?
379 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:30:14 ] 未定義の動作ですよ
380 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:39:49 ] int m = (a)>(++b) ? (a):(++b); だとOKで、 int m =++b, a , ++b; だと未定義の動作なのですね。 うーん、ややこしいです。 両方とも一つの式の中で2回bの値が 変化しているように思うのですが、 どういった相違により 片方がOKでもう一方はダメに なるのでしょうか?
381 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:41:58 ] カンマがね、ヤバイんですよ・・・ここだけの話
382 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:54:23 ] unsigned A(){ struct{unsigned a;unsigned operator()(int x){return ++a<<x;}}r={1}; retrun r(0)|r(8)|r(16)|r(24);} 0x04030201 // 式中でオブジェクトの順状態て保証される?
383 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 21:00:47 ] >>382 されない
384 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 21:42:11 ] なんか関数の実引数の区切りのカンマと、カンマ演算子を間違っているやつがいるようだ。 >>378 の m, b ともに 5 になることは保証されているぞ (5.18-1) m=func(++b, a, ++b); だと未定義動作だけどな。 >>376 副作用完了点でぐぐってみるべし
385 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:03:09 ] a++, a++; 未定義
386 名前:380 mailto:sage [2010/02/26(金) 22:23:55 ] int m=func(++x, ++x); が未定義動作というのは全会一致ってことですね。 int m = (a)>(++b) ? (a):(++b); は正当で int m =++b, a , ++b; も正当 ですが int m =++b, ++b; は未定義ということなのですか? int m=(++x) + (++x); は未定義動作になりますか?
387 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:39:06 ] 未定義
388 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:39:58 ] >>384 int a=3; int b=3; int m =++b, a , ++b; このときにmが5になることが保証されているといっている?
389 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:40:35 ] >>378 これはコンパイルエラーでしょ。
390 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:43:36 ] >>384 カンマ演算子は副作用完了点たりえないのでは?
391 名前:390 mailto:sage [2010/02/26(金) 22:45:15 ] 間違えて覚えてたみたい。ごめんなさい。
392 名前:384 mailto:sage [2010/02/26(金) 22:46:49 ] 章番号までちゃんと示してある。言語規格書呼んでから話するんだな。
393 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:54:23 ] >>392 自信満々のところ水を差すようだけど、 >389 の言うとおりコンパイルエラーになると思うんだ。 カンマ演算子とか言ってるところを見ると、 int m =(++b, a , ++b); こう解釈したんだろうとは思うけど。
394 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:54:31 ] 特例は3項演算子、カンマ演算子のほかに&&と||もあるから int b=1; int a=++b&&++b&&b; こんなのでもちゃんとa=3になるな しかしひどいコードだ
395 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:57:41 ] もういいから黙って二行に分けろよカス
396 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:59:04 ] >>393 その程度だろ codepad.org/8ZqDzVjC 今話してる話題と関係ないだろ
397 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:07:28 ] 何そのイン○リさんみたいな返し?流行ってんの?
398 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:08:14 ] 何言ってんだか
399 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:11:21 ] >>393 コンパイルエラーにはならず、カンマ演算子の最後、つまり2回目の++bが値として使われるので mに4が代入された後、bはインクリメントされる。 なので、>>388 を書いた。
400 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:16:56 ] >>399 なんだか知らんが ++bは前置増分演算子って呼ぶってことは知ってるの?
401 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:20:01 ] ttp://codepad.org/xadcb34S ああこういう意味でコンパイルエラーってことね。 上記の話をまとめると int m =(++b, a , ++b); は ttp://codepad.org/J7jHthUQ のようになり、正当な動作をするって考えていいのね。
402 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:21:46 ] つまり 3項演算子(条件演算子 カンマ演算子 && || の4つは、副作用完了点となるから それらのオペランドに++aが複数回出現しても 未定義の動作にならないってこと?
403 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:29:57 ] >>400 なんだかどうしようもないところでボケていてすまんかった
404 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:45:55 ] >>402 「オーバーロードされてなければ」それで合ってる
405 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 15:54:25 ] ttp://codepad.org/AsWip2mX このコードで std::cout << hairetsunoyousosuu(arr) << std::endl; の部分は 期待通りになるのですが std::cout << foo(arr) << std::endl; の部分が期待通りになりません。 どうすれば 「引数として渡された配列の要素数を返す『関数』」 が書けるでしょうか? よろしくお願い申し上げます。
406 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:00:57 ] 関数の仮引数の[]はただのポインタに変わる コンパイル時にわかるものなら_countofを参考にする それをDLLとして公開するとか誰が渡すんだかわからないものを自動で取得する汎用的な方法はない
407 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:03:23 ] >>405 main::arrはint[5]型 foo::argはint[]型 sizeof(int[5])はsizeof(int*) * 5 sizeof(int[])はsizeof(int*) int*とintの大きさがたまたま同じだっただけ。
408 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:05:30 ] >>406 ポインタとは違ってmainで定義したarrの要素全部がコピーされるけどね。
409 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:34:50 ] 構造体と勘違いしてんじゃねえのお前
410 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:42:25 ] こまけぇことはいいんだ、vector使え!
411 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 18:23:11 ] >>405 なんか codepad は Error 500 で見れなかったんだけども、こういう話? d.hatena.ne.jp/matsutakegohan1/20071006/1191643652
412 名前:405 mailto:sage [2010/02/27(土) 19:19:17 ] >>406-411 みなさんありがとうございます。 template<class T, int N> int len(T (&)[N]){return N;} と #include <cstddef> template<typename T, std::size_t N> char (&lengthof_helper_char_array(T (&a)[N]))[N]; #define lengthof(a) (sizeof(lengthof_helper_char_array(a))) ですと、どちらが望ましいのでしょうか?
413 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 19:24:04 ] >>412 どちらが望ましいかは場合によるね。 前者はコンパイル時定数としては使えない。 後者はコンパイル時定数として使えるようにしてあるけど、そのために読みにくく なっているし、基本的に避けるべきであるマクロまで組み合わされている。
414 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 19:39:51 ] >>413 なるほど、そう言った違いがあるのですね。 ありがとうございました。
415 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 19:43:00 ] ttp://www.kijineko.co.jp/tech/superstitions/parameter-of-isalpha-is-char.html ここに書いてあることについてお伺いしたいのですが。 const char str[] = "abc123"; for (char* s = str; *s != '\0'; s++) { if (isalpha(static_cast<unsigned char>(s))) { ... } } こうすべきとのことですが、これは const char str[] = "abc123"; for (char* s = str; *s != '\0'; s++) { if (isalpha(s)) { ... } } の用にキャストを外すと動かないことがあるということでしょうか? "abc123"のように、内容全てがASCII文字であってもだめなのでしょうか? よろしくお願い申し上げます。
416 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 19:46:07 ] >通常は問題ないのですが、多バイト文字を含む文字列の各要素を順に is 系関数で調べる場合などは、
417 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:04:49 ] >>416 多バイト文字を含む文字列の各要素も isalphaでアルファベットかどうかを調べることが可能と言うことでしょうか? たとえば "あいうえおabcd" のような全角文字でもできるのでしょうか?
418 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:10:47 ] その記事も含めてそんなことをいってる奴は居ない
419 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:11:28 ] > is 系関数に実引数として渡すことができる値は、0 〜 UCHAR_MAX または EOF だけです
420 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:30:00 ] ASCIIだけなら問題ないんじゃない? 他の文字コード入ってたら知らんけど
421 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:58:27 ] "abc123"は多バイト文字を含む文字列ではありませんよね。 では多バイト文字を含む文字列の各要素を順に is 系関数で調べる場合など とは、具体的にはどんな文字列のことなのでしょうか?
422 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 21:17:37 ] sjisとかunicodeとか。 isalphaのかわりに_ismbcalphaやiswalphaで調べられる。
423 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 21:22:38 ] 3の倍数のときだけ多バイトな文字列の例. "123456789"
424 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 21:39:22 ] それスゲー迷惑だけどオッサンが漢字キーを駆使しながら頑張って作ったものだと想像するに少し許せる 正規表現置換とかだったら死刑
425 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 23:14:54 ] 文字コードって訳わかんない ひとつに絞って他のコードは国際法で規制しろよ
426 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 23:43:28 ] >>425 トロンコード最強ってことで。くっくっく。
427 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 00:29:23 ] >>415 isalpha()に「0〜UCHAR_MAX または EOF 以外の値」が渡された時の動作は未定義 ということはわかっているのかね。きじねこは不可解な動作やらクラッシュという表現をしてるが 例えばstrにSJIS全角文字「A」(コード0x8260)を含んでいたとして(str="Aabc123"とか) forループ内でisaplha()に、0x82、0x60と渡されていくことになるが、 例えばcharが符号付きでint型が32ビットの処理系だと0x82→0xffffff82と 符号拡張で変換されるから「0〜UCHAR_MAX または EOF 以外の値」となって未定義となる unsigned charにキャストしとけば「0〜UCHAR_MAX または EOF」には納まる このきじねこの記事雑だな constや*忘れてる
428 名前:415 mailto:sage [2010/02/28(日) 00:34:56 ] >>422 >>423 >>427 解説ありがとうございます。 そう言った意味なんですね。
429 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 18:15:24 ] hoge *p = new hoge; my::smp q(new hoge); // ok my::smp r(p); // no! 上の初期化法だけを許可したいんだけど、方法はある? つまりテンポラリなポインタだけを受け取れるような方法 C++0xだと右辺値参照というのがあるからできるらしいのだけど・・・ 今ではまだメタプログラミングを駆使しても不可能かな?
430 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 18:20:41 ] 無理。my::smpのコンストラクタ内でnew hogeを実行するようにすれば近いことはできるんじゃない? 引数付きのコンストラクタも考えると現実的でないが
431 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 19:01:30 ] >>430 thx コピーコストが気になるけどその方向で考えてみますわ
432 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 21:10:12 ] boostにそんなのがあった気が
433 名前:デフォルトの名無しさん [2010/02/28(日) 23:34:24 ] テンプレートクラスについてお聞きします。 テンプレートクラスは、ヘッダファイル内に関数の実装の定義も書きますよね? もしテンプレートの特殊化をした場合は、cppファイルに書いていいものなのでしょうか? たとえば、テンプレートパラメータにbool値をとるクラスを定義したとして、 関数の実装をヘッダファイルに書かず、 テンプレートパラメータがtrueのときの処理と、falseのときの処理を それぞれcppファイル側に書いてもいいものでしょうか? (そのようなクラス設計がいいかどうかは別として・・・)
434 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 23:36:04 ] >>433 まずいだろう 他のファイルからもそのヘッダファイルを参照していたらどうなる?
435 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 23:50:58 ] >>433 いいよ template<bool A> struct X { void f() {} }; template<> struct X<true> { void f(); }; とヘッダーに書いて void X<true>::f(){} を別のコンパイル単位に書くのはOK。 bool が typename でも同じ
436 名前:デフォルトの名無しさん [2010/02/28(日) 23:51:44 ] クラス設計に関して質問です。 Waveファイルの入出力に関するクラスと、再生に関するクラスの2つを作ったとします。 実際waveファイルを入力して、再生するというプログラムを書く場合オブジェクトを何にしたらいいでしょうか? オブジェクト指向がよくわかっていなくて・・・
437 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 23:59:35 ] // ヘッダファイル template<bool B> struct hoge { hoge(); }; // ソースファイル template<> hoge<true>::hoge() {} template<> hoge<false>::hoge() {} これで問題ないね
438 名前:433 [2010/03/01(月) 00:18:10 ] >>435 >>437 ありがとうございました!
439 名前:デフォルトの名無しさん mailto:sage [2010/03/01(月) 00:45:56 ] >>436 WaveIO obj = new WaveIO(filePath); Player obj2 = new Player(); obj2.Play(obj); とかってなるんでないの
440 名前:デフォルトの名無しさん mailto:sage [2010/03/01(月) 02:23:03 ] マルチスレッドキューありますか。 自作しようして無理だった。
441 名前:デフォルトの名無しさん mailto:sage [2010/03/01(月) 05:44:38 ] >>432 make_sharedだな。TR1にもC++0xにもある。 >>440 Intel TBBになんかあったはず。
442 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 00:34:04 ] クラスのメンバ関数とそのconst関数の共通化をしようとして失敗しています。 以下のコードでは [ ]演算子のオーバーロードがその例です。 どうしたら理想([ ]によるメンバ変数arrayの中身変更)的な動作になるでしょうか? codepad.org/9YXChfJT
443 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 00:56:27 ] 高校1年の春、2年生に進級する直前のできごとでした。 僕は難関、最初の壁と名高いポインタにぶつかりました。 ポインタ・・・彼は僕を苦しめました 存在が意味不明でした。 『本当に必要なのか? いつ、使うの?君はなんなんだい?』 僕は寝ることをやめて飲まず食わず 1週間、ずっとポインタを見つめた結果 理解できませんでした・・ そのときの挫折はまさに、絶望でした。 自分の理解力の無さと頭の悪さに怒りを覚え その怒りはそのうちに悲しみにかわり 僕は1ヶ月、眠れませんでした。
444 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 01:11:16 ] >>442 × return const_cast<double&>( static_cast<const Test>(*this)[pos] ); ○ return const_cast<double&>( static_cast<const Test&>(*this)[pos] );
445 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 01:14:32 ] そんな僕がまたプログラマ目指そうと思ったのですが どう思います?
446 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 01:17:12 ] >>445 好きにすればいい。分からない事があったらここに書き込めば俺は答える。
447 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 02:35:19 ] >>444 ありがとうございます。 <間違い> return const_cast<double&>( static_cast<const Test>(*this)[pos] ); は、static_cast<const Test>(*this) で *this の中身をコピーした const Test型 のオブジェクトを生成し、 その生成されたオブジェクトに [pos] でアクセスしている。 だから、実際には *this の中身にアクセスできていない。 という解釈で良いでしょうか?
448 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 02:38:14 ] >>442 こういうのも return const_cast<double&>( static_cast<const Test*>(this)->operator[](pos) );
449 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 02:41:27 ] >>447 そういうこと。
450 名前:442 mailto:sage [2010/03/03(水) 04:18:56 ] >>448 >>449 ありがとうございます!
451 名前:デフォルトの名無しさん [2010/03/03(水) 07:50:18 ] ツリーのクラス構造について質問です。 現在、以下のようなクラスを考えています。 class Base{} class ParentBase : public Base { }; class Parent : public ParentBase { }; class ChildBase : public Base { }; class Child : public ChildBase { }; class ChildA : public Child {} class ChildB : public Child {} class ParentA : public Parent { public: ChildA childa; ChildB childb; }; class ParentB : public Parent { public: ParentA parenta; }; Parentの派生クラスは、メンバ変数でChildだったり、Parentのオブジェクトの実体を保持します。(例:ParentA, B) ここで、各Parentが保持するオブジェクトから、親オブジェクトへアクセスする方法はないでしょうか? やりたいことは、ParentA::childaで、ParentAの関数を呼ぶ、ParentB::parentaで、ParentBの関数を呼ぶ、ということがしたいのです。 一番基底クラスのBaseクラスで、Baseクラスへのポインタ持たせてやろうと思ったのですが、そのポインタへの実体のセット方法がわからなくて、迷ってしまいました。 何かいい方法はないでしょうか?
452 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:04:37 ] ポインタを理解したのは、確かポインタ渡し、参照渡し、値渡しの違いを知ったときだった憶えがある
453 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:15:38 ] >>451 コンストラクタで渡すなりセットするメンバ関数を作るなり public にして設定するなり、 いろいろあるだろ。何が気に入らないんだ?
454 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:27:28 ] struct hoge: public unary_function<int,int> { int operator(int); }; 的な関数オブジェクトを g++ -Weffc++ hoge.cpp でコンパイルした場合、 warning: base class struct std::unary_function<int, int> has a non-virtual destructor というエラーがどうしても出るのですが、 ライブラリの責任であってユーザ側からは対応しようがない、 というので正しいでしょうか?
455 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:41:08 ] protected継承
456 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:43:09 ] >>454 ja.lmgtfy.com/?q=%22warning%3A+base+class%22+std%3A%3Aunary_function+%22has+a+non-virtual+destructor%22
457 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 12:35:06 ] >>456 要するにGCCがそうだと言ってるからそうだ、ということですね。 これに対するライブラリ実装者の答えが欲しいのですが・・・。
458 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 12:38:09 ] >>457 どうしてそうなったw
459 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 12:42:54 ] >>457 >456 のリンクをたどると、 >454 の警告に関する gcc の「バグ」報告に連れて行かれて、 その報告は今でも "NEW" として残っているんだが、何か違うものが見えるのかい?
460 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 12:46:39 ] そう読むのか。 コメントのほうを読んで誤解してしまいました・・・。 ありがとうございます。
461 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 16:09:59 ] >>454 が何を問題だと言っているのか判らない。 もしかして、Effective C++ 読まずに問題視してる?
462 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 22:27:54 ] 調子に乗って struct を class みたいに使うのが悪いんじゃね?
463 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 22:37:41 ] どうせポリモルに扱わないんだからほっとけよ
464 名前:デフォルトの名無しさん [2010/03/03(水) 22:37:41 ] >>454 どこに「エラー」って書いてあるんだよ もしかしてエラーと警告を混同してるか?
465 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:00:41 ] C++のキャストって長ったらしくてあまり使わないんですが, 実際C++のキャストで助かった&Cのキャストではまった 経験をお持ちの方っていますか?
466 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:08:51 ] C++スタイルはデバッグで見つけやすい
467 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:18:38 ] >>465 キャストは奨励できないからC++のキャストは長い。 キャストにも色々な目的があるので種類がある。目的に合わない変換不可能なものにはエラーが出る。 あらゆる変換ができるCスタイルのキャストはバグを見つけにくいので使わないほうがいい。
468 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:20:00 ] long longな値をstd::fstreamに<<すると三桁区切りにcommaが入ってPCが爆発するんだけど 書式設定だとか弄ってcomma入れないような設定できなかったっけ?
469 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:50:17 ] >>465 意図しない、または、意図した以上のキャストをコンパイル時に発見できる
470 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:59:55 ] >>468 localeとfacet thousands_sep()が返す値を確認するとよい
471 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 00:28:37 ] C++スタイルのキャストでコンパイルエラーがでる度に助かっているわけだ
472 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 00:44:21 ] >465 検索が簡単。
473 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 05:25:49 ] 分かってても、警告がうざい&タイプが面倒だから、使ってしまう(int)キャスト
474 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 06:50:49 ] >>473 しね
475 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 07:30:55 ] dynamic_castの機能はCスタイルのキャストでは実現できない
476 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 08:12:19 ] キャストの多さは設計の不十分さを示す良い指標
477 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 10:50:11 ] dynamic_castはゆとり const_castはバグ
478 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 12:20:32 ] stdの特殊化が許されてるのはswapだけですか?
479 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:28:12 ] ていうかstatic_castも暗黙的な変換ができないポインタ変換に対して使えちゃうだろ。 static_castは甘え
480 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:33:06 ] dynamic_castを使う設計てどっかミスってるはず ダウンキャストするんだったら自前の仮想関数テーブル作れよって話しだ
481 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:35:39 ] いやdynamic_castでいいだろw
482 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:37:38 ] >>481 アップキャストした後にダウンキャストとかポリモーですらないじゃん
483 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:40:39 ] クロスキャストなんてboostにそれ専用のがあるだろ?
484 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:43:24 ] >>483 うるせーテーブル作らせろ いやまじでダウンキャストとか使う場面なくね? 面倒だからやっちゃえとかならわかるんだが
485 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:54:06 ] 同意 内部でdynamic_cast使ってるboostとか糞だよな
486 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 14:14:02 ] RTTI嫌ってるやつって厨二病みたいなもんだろ?
487 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 14:32:25 ] RTTIは遅くなるっていうけど、実際影響がどんなもんか分からん
488 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 14:39:26 ] RTTIで起きる速度低下の影響は自前で仮想関数テーブルを用意する場合と同じ。
489 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 14:41:41 ] 見栄の問題なのか?w
490 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 15:06:56 ] >>489 見栄だよ 型名保持してポインタを型変換するだけだし でも使ってない
491 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 16:48:51 ] C++ってゲームプログラミングに使える?
492 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 16:56:09 ] >>491 DirectX使えば、いろいろ綺麗に作れるぞ。
493 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 18:18:44 ] >>492 取り合えず勉強してみます ありがとう!
494 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:14:40 ] キャストは結局のところ「正しくないかもしれないけど見逃してくれ」とコンパイラに指示している。 キャストが正しいことをプログラマーが保証しなければならない。 dynamic_cast(RTTI)もNULLが返る可能性も考えてプログラムを作らなければならない。 どんなにデバッグしても、キャストは客先でプログラムがクラッシュするかもしれない時限爆弾を抱えるようなものである。 暗黙の型変換や仮想関数であれば必ず正しい動作をすることがコンパイラが保証するので堅牢になる。 わずかな設計の見直しでリスクを減らせるんだからキャストは控えるのを勧める。
495 名前:デフォルトの名無しさん [2010/03/04(木) 20:22:37 ] プログラムが正しいかどうかをコンパイラに丸投げする考えのほうがよっぽど危険だよ 第三者たるコンパイラが勘違いしそうな「本当は正しい」ところをマークするのがキャストだ できちゃいけないキャストが通る理不尽な仕様は確かにあるが、それは できることとしていいことの分別がつく人しか C++ を使うべきではないということだ
496 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:31:50 ] キャストは影響を局所化してさらに見えないように包めばいいじゃない
497 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:35:09 ] >>487 1万回ループさせて0.1秒差とかそんなもん >>494 NULLが返る可能性を考えないのにdynamic_castを使うとか意味がわからん そんなの参照と例外に狂ってるやつくらいだろ
498 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:37:50 ] 暗黙の型変換でプログラムが堅牢になると聞いて
499 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:37:59 ] たった10000回で100msも差がでるのか。 100000000回で10msくらいでもまだ遅いのに
500 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:42:30 ] >>499 そんな見栄を張るなよw
501 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:43:44 ] >>478 swap以外もすべて明示的特殊化してよい。
502 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:45:32 ] 暗黙の型変換で堅牢 ハハッ
503 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:45:45 ] >>500 ごめん・・・最近なにしても楽しくないし2chで見栄張る位しか生き甲斐がなくて・・・。 もう自衛隊に入るわ。最近政治がアレだし俺みたいなクズ人間は戦争で死んでも誰も悲しまないだろう。
504 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 21:04:38 ] >>503 自衛隊がお断りだ
505 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 21:19:52 ] >>504 もうニート生活はやだよ・・・
506 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 23:01:18 ] 普通にstatic_castしか使わない = Cのキャストでおk static_castでエラーが出るケースなんて,経験でわかるようになる程度じゃろ
507 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 23:06:17 ] >>506 > static_castでエラーが出るケースなんて,経験でわかるようになる程度じゃろ いや、わからない人用にあるわけじゃないんだけど。
508 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 23:09:06 ] >>506 どんなに経験積んだって人間は間違えるから予防が必要なんだよ
509 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 23:14:27 ] 構文が悪い static_cast<int>(var)と(int)varじゃ 後者を使いたくなるのもわかる
510 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 23:15:31 ] >>506 よくないよ。 static_cast 継承関係に無い型をキャストしようとエラーになる Cスタイルキャスト 継承関係に無い型をキャストしてもエラーにならない。
511 名前:デフォルトの名無しさん [2010/03/05(金) 00:31:20 ] インディアン 嘘つかない
512 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 00:46:24 ] Cスタイルのキャストを残したビャーネが悪い
513 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:00:33 ] 残すも何も互換性だから
514 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:04:56 ] じゃあ完全互換じゃなくしたビャーネはもっと悪い
515 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:07:44 ] CとC++って完全互換じゃないの? extern C/C++ とかでなんとかなると思ってたんだけど だれか反例教えちくり
516 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:13:04 ] 100%の互換となることを目標としたことは一度もない、とプログラミング言語C++に書かれているよ
517 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:26:17 ] そうなのか,買って呼んでみるよ
518 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:28:12 ] >>515 www.google.co.jp/search?q=C+C%2B%2B+%E4%BA%92%E6%8F%9B%E6%80%A7 www.google.co.jp/search?q=C+C%2B%2B+compatibility
519 名前:デフォルトの名無しさん [2010/03/05(金) 01:30:15 ] int class; この時点から 100% じゃないしな
520 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:31:10 ] >>515 変数名に new とか関数名に delete とか、余裕で死ねる。
521 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:31:25 ] C89 でもちょこちょこ違うのに、C99 で決定的になったからな<非互換性。 ああ、すべての言語に複合リテラルがあればいいのに。
522 名前:デフォルトの名無しさん [2010/03/05(金) 01:47:46 ] >>521 残念ながら C++ は C89 ではなく K&R C から派生した言語なので C++ が C89 に対して互換性がないのではなく、 C89 が C++ に対して互換性がないんだよ C++ 側に「捨てた罪」があるのは K&R C に対してだけなのが原則で extern "C" などの後付け設定がこの原則の例外
523 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:50:13 ] >>522 > 残念ながら C++ は C89 ではなく K&R C から派生した言語なので はつみみです ソースある?
524 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:51:49 ] D&Eでございます。
525 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:05:31 ] それ、禿一人で作ってたころのはなしじゃねーの? 少なくとも ISO C++ が参照してる C は ISO C だし。
526 名前:デフォルトの名無しさん [2010/03/05(金) 02:07:38 ] どのクラスからも呼び出すことの出来る変数はどのように宣言するのでしょうか? staticやexternがあるみたいですが いかんせんエラーが出ます。どうか教えてください
527 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:08:00 ] >>522 C++ の設計が K&R C から始まったとして、どうしてそれが 標準 C++ と標準 C との互換性の主従に関係するの?
528 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:08:44 ] >>526 ソースとエラーメッセージうp 長いなら >>6 へ
529 名前:デフォルトの名無しさん [2010/03/05(金) 02:15:54 ] >>528 長いんで省略した形で記述します。 たとえば ================================== //○×.h class Cabc : public ** { 省略 public: //ここでグローバル変数を記述したい static CString str; //省略 } ///////////////////////////////////// ○X.cpp //省略 str = _T("a"); //省略 ///////////////////////////////////// このstrの値を他のクラスで使いたい場合 CString buf; buf = Cabc::str ; のようにしてもダメなんでしょうか? わかりにくくてごめんなさい なにぶん初心者ですのでよろしくおねがいします
530 名前:デフォルトの名無しさん [2010/03/05(金) 02:17:13 ] >>527 公式に「主従」なんかないだろう 俺は事の経緯から導かれる道義的な関係を指摘したまで
531 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:22:40 ] >>515 extern "C"はCとC++の間でグローバルな関数・変数がリンクできるようになるだけ。 構文の解釈が変わるなどといったことは起こらない。 互換でない例としてはvoid*から他のポインタ型の暗黙変換が可能か否かなど。
532 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:31:53 ] >>530 いや、導かれてないから。 >>522 の1行目が事実だとしても2行目以降は あんたが勝手に言ってるだけでしょ。道義的関係とか意味わかんないし。 C89 が当時の標準化もされていなかった C++ と互換性がないとか、当たり前だし。
533 名前:デフォルトの名無しさん [2010/03/05(金) 02:36:39 ] >>532 C89 の目玉が C++ からの逆輸入という事実もあるわな 当時の C++ が標準化がされていようがいまいが C89 はその道を選んだ どっちが合わせるべき立場にあったかは明確であろう
534 名前:デフォルトの名無しさん [2010/03/05(金) 02:37:24 ] 今日は寝落ち
535 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:45:27 ] >>533 合わせるべき立場とか、無いから。それ、妄想だから。 その調子で「C++0x は C# に合わせるべき立場にいる」とか 「C++0x は D に合わせるべき立場にいる」言い出すやつが いたとしたらどう思うよ? あんたが C++ 大好きなのはわかったが、これはさすがに 言いすぎだろ。
536 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:58:29 ] 先発のものが後発に合わせるわけにはいかないってだけのことだろ C#がC++0xに対して互換性が無いのと一緒
537 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 03:00:29 ] long longや可変個引数マクロ、数学関数などC99からC++0xへ持ち込まれるものだってある。 初期化リストをC99の複合リテラルと互換性のある構文にしようという提案が出たことだってあった。 CとC++は,お互いに影響を与えつつ受けつつという関係だと思うなぁ。
538 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 03:04:36 ] 内部クラスではtemplateが使えないのでしょうか? 以下のようなコードとコンパイルエラーが出ます。 gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9) test0.cpp: In function ‘void func()’: test0.cpp:14: error: expected primary-expression before ‘template’ test0.cpp:14: error: expected ‘;’ before ‘template’ test0.cpp:30: error: expected ‘}’ at end of input 12: void func() 13: { 14: template<class T> 15: class Hoge{ 16: public: 17: static void foo( const T& val ){ 18: cout << val << endl; 19: } 20: }; 21: 22: Hoge::foo(); 23: }
539 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 03:24:35 ] 使えない。
540 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 06:03:48 ] >>529 > わかりにくくてごめんなさい わかりにくいのは、エラーが何なのかをキミが隠しているからだ。 人生相談コーナーに「とある良くないことが起きました。どうすればいいですか?」とだけ書いて 送っても、「まぁ、気を落とさずに」みたいな曖昧なアドバイスしか来ないぞ。
541 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 06:57:39 ] >>529 .cppのstrって何者?
542 名前:デフォルトの名無しさん [2010/03/05(金) 07:37:28 ] >>540 えっと、、そこまで難しいことではないんです ただ、たとえばどんなクラスからでも使えるCStringの変数が欲しいわけ でそういうのはどうするのか?という質問なんです。
543 名前:デフォルトの名無しさん [2010/03/05(金) 07:39:41 ] >>541 ヘッダで宣言したCStringのつもりです。 このstrをどんなクラスからでも参照可能にするにはどうしたらいいのでしょうか? とても困っています よろしくお願いします
544 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 07:42:25 ] ここまで頑としてエラーを書かないのは何でだろうね。 クイズの出題者気取り?
545 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 07:44:23 ] 静的メンバ変数でググれ
546 名前:デフォルトの名無しさん [2010/03/05(金) 07:50:13 ] >>544 エラーは LicenselistViewerList.obj : error LNK2001: 外部シンボル ""public: static class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > CLicenselistViewerList::strrr" (?strrr@CLicenselistViewerList@@2V?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@A)" は未解決です。 です。 俺はただこの問題が解決してほしいだけなのでクイズとかそんなんではないです 本当に困っています
547 名前:デフォルトの名無しさん [2010/03/05(金) 07:51:54 ] >>545 ググって解決できないから頼んでます。 静的メンバ変数だとこのやりかたで宣言したstrは Cabc::strで外の変数を使えるとあります。 使えません どうしてでしょうか?
548 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 08:03:30 ] 宣言はあってる 定義の仕方が悪い
549 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 08:08:19 ] >>546 エラーメッセージは開発者がなにをすべきか直ぐ分かるようにするために出力してるんだぜ class名::str; を.cppの先頭付近にでも書いとけ
550 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 11:48:45 ] >>546 > strrr "r" 増えてね?
551 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 11:52:05 ] デュラララみたいな
552 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 13:23:56 ] >>546 static CString CLicenselistViewerList::strrrという静的メンバ変数の 実体の定義が見つからないのでリンクできないというエラー 静的メンバ変数はヘッダで宣言のみではダメで実体の定義 CString CLicenselistViewerList::strrr; を.cppファイルに記述する必要がある
553 名前:デフォルトの名無しさん [2010/03/05(金) 14:19:52 ] あのー *x1 += a; ってどういう演算するんですか?
554 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 14:21:33 ] >>553 x1 の指すオブジェクトに a を加えるっぽい。 これ以上は x1, a の型を明らかにしないとわからん。
555 名前:デフォルトの名無しさん [2010/03/05(金) 14:28:19 ] っへー!! てっきり、num1 = a + *x1; とかで何か用意しないとこのaと *x1の合計は作れないものだと思ってました! てことは -=で引き算出来るんですか? ホンマ助かりました。今ポインターの勉強してるんです。 ちなみに問題は最初に点数を指定させて、加算点を入力させるというものです。 やさしいc++第3版 著高橋 をやっていました。回答例に出てきていたので なんぞこれってかんじでした
556 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 14:30:03 ] 引き算できるよ。*=,/=もあるし&=,|=,>>=みたいなのもある
557 名前:デフォルトの名無しさん [2010/03/05(金) 14:31:29 ] 人の顔のAA二ミエマス。 ホントに貴方紳士ですね!また質問に着ます! 有り難うございました
558 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 14:41:48 ] >>557 名無しさんが一人だとでも思ってるのか?
559 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:29:43 ] 環境:WindowsXP、VS2008 Express Edition 知っている方がいましたら教えて下さい。 現在、GUIアプリの作成を行っているのですが、 (Windowsフォームアプリケーション開発) 一つ分からない事があります。 下のURLにあるようなTreeViewが欲しいのですが(ページの上の方にあるやつです)、 www.codeguru.com/cpp/controls/treeview/multiview/article.php/c3985 どうやって実現するのでしょうか? ツールボックスを見ても、TreeViewはあるのですが、 上記のようなTreeView+Columnというのがどこにあるのか分からなくて・・・。
560 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:48:23 ] こっちで訊くのがいいと思う pc12.2ch.net/test/read.cgi/tech/1259076828/
561 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:50:34 ] >>560 誘導サンクス。 >>569 は誘導先で聞いてみます。
562 名前:561 mailto:sage [2010/03/05(金) 15:51:16 ] ×>>569 ○>>559
563 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:51:18 ] struct a{ virtual ~a{} }; struct b : a{ int array[8] }; //... a *ptr = new b; //... delete ptr; //ptrはa*だけど実際に指しているのはヒープに配置されたbのインスタンス. sizeof(a) != sizeof(b)なのにこんな事してもいいの?
564 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:57:40 ] いいよ
565 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:58:11 ] 全て分かった上で、話題作りで書き込んでる様に見えるんだが そりゃ解体子が仮想だから
566 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 16:15:07 ] >>565 destructorがvirtualかどうかは関係ないでしょ? >>563 newしたときのサイズがどこかにしまってあるから。
567 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 16:22:33 ] >>566 すまんが釣りに見える
568 名前:563 mailto:sage [2010/03/05(金) 16:30:00 ] 解体子っていうのはクラス内部のリソースを開放したりするためのもので、 自身がヒープに配置されていたり、それのメモリ管理は関係ないような認識でした。 事実、インスタンスがスタックに配置されていてもデストラクタは走ります。 これは、インスタンスのメモリ管理はインスタンスを抱えているスコープが管理するべきだという事です。 曖昧な理解が解消して助かりました。ありがとうございます。
569 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 17:11:53 ] Java厨は勉強熱心だなぁ それにくらべてC++erは・・・
570 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 17:17:57 ] >>566 ちょっと焦ったわ なわけねえだろw
571 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 17:46:12 ] JavaとC++の両刀使いの人っている?
572 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 17:47:38 ] ASもJSもPerlもRubyもEsolangも普通にやるがね
573 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 18:54:59 ] 563は納得したのだろうか。 確保した領域の大きさについてだけ言えば566が正しいと思う。 確保した自由記憶領域の大きさはOS(システムコール)が記録している。 解放する時に大きさを知っている必要は無い。 p = malloc( N ) の後 free( p ) だけでいい(Nを指定する必要が無い) のと同じ。 そういう意味では565は見当外れ。 まぁC++スレだし、そういうことを訊きたい訳じゃないんだろうけど
574 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 18:58:27 ] ポインタを整数サイズで-1して整数表現で取り出したらサイズだったなんてことはよくある事
575 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 19:09:37 ] 上のシンプルな例ならともかく多重継承なら死にかねない
576 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 19:58:38 ] copy(vec.begin(),vec.end(),ostream_iterator<T>(cout,"#")); だと最後にもセパレータが入って 1#2#3# となってしまいますが、 1#2#3 がたいてい欲しいものだと思います。 whileの内で条件分岐させる以外にうまい方法知りませんか?
577 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:20:28 ] 最後の一つ前までやればいいだけにみえる
578 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:34:14 ] >>577 --vec.end() なんて怖すぎます! ・・・ブルブル。
579 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:37:18 ] ランダムアクセスイテレータならcontainer.end() - 1でいいだろ
580 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:37:49 ] 怖くねーよカス
581 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:42:41 ] あれ、空のときに困ると思ったんだけど、 やってみたら大丈夫だった・・・?!
582 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:44:05 ] あ、わかった。 要素が一個だけのとき、何も出力されなくなる。
583 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:46:19 ] >たいてい欲しいものだと思います いや別に。 上手いやり方か知らんが、自分で適当に ↓みたいな反復子を作るのは駄目なのか? codepad.org/o3QbtQyC
584 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:47:03 ] いや、そもそもぜんぜんダメだ。 v=[3,4] のとき、出力が 3# ですよ。。。
585 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:51:56 ] >>583 やっぱそっちですか。 イテレータとかすぐに書けないけど・・・。 ありがとうございます。
586 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 21:46:35 ] >>585 楽してイテレーター書くならこんなのどうかな。 www.kmonos.net/alang/boost/classes/iterators.html
587 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 21:59:38 ] boostはホント何でもありますね・・・。 なるべく依存したくないけど。 >>583 理解できたので、ほとんどそのまま使いまわせそうです。 たいへん助かりました。
588 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 22:04:19 ] >>587 boostでテクニック勉強したら、自分でサブセットなライブラリを作れば依存しなくてすむんじゃないかな。
589 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 00:54:10 ] >>575 何のこと?
590 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 07:16:34 ] Hoge Hoge::getObj( ){ return *this; } Hoge& Hoge::getObj( ){ return *this; } return *this はそのままで戻り値の書き方次第(Hoge& or Hoge)で 参照返しとオブジェクトのコピー返しと変わってしまうというのに違和感を感じる。 上の2通りの違いを *this の部分でも書き示す方(例:参照返し→ @*this )が良かったのに、と思ってしまうのですが どうですか? (どうですか?、って言っても仕様だからどうかなる話ではないのですが)
591 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 07:42:38 ] それが気になる人は、それ以上に、関数を呼び出すほうも気になるだろうね。 int func1(const Hoge& h); int func2(Hoge h); Hoge hoge; func1(hoge); func2(hoge); // 同じ書き方 関数定義を書いている時は、すぐそこに戻り値の扱いが見えてる安心感があってまだいいけど、 関数呼び出しを書いている時は、関数の宣言or定義がよその何処かに書かれてる。 エディタ支援があるとはいえ、「遠くの何かを知ってなきゃいけない」感じがあって、より落ち着かないのでは。
592 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 08:48:31 ] constなら区別して呼び出せるけどね void foo(int& a); void foo(const int& a); int a; //constではない foo(const_cast<const int&>(a)); //ここはconst版を呼びたい
593 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 10:22:01 ] 関数宣言見ただけじゃ参照かどうかわからなくて困るだろ と思ったけど int &a = @b; みたいにしてほしいってことなのかな
594 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:19:24 ] constにするときはstatic_castでいいんじゃないか
595 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:30:14 ] そんなことよりint @sp = spnew int [10]; int $wp = wpnew sp;を組み込んでくれ
596 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:31:26 ] シンタックスシュガーは もっと多くてもいい
597 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:42:32 ] オレサマプリプロセッサ作って好きに構文創作しれ
598 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 13:55:16 ] >>597 #define amigo friend; 愛用してます
599 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:28:31 ] フレンド程度に内面を洗いざらいさらしていいのか?
600 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:34:29 ] >>597 #define foreach BOOST_FOREACH
601 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:37:34 ] >>599 friendのおかげで、余計なpublicを作らずprivateで済ませられるんじゃないのか。
602 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:40:05 ] #define buddy friend; じゃないの?
603 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:42:12 ] friendはクラステンプレート中にテンプレート関数を定義したい 時に、暗黙の型変換ができるように使っている。 Effective C++で紹介されていた内容。
604 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:56:22 ] >>598 ほらみろよく判って無い奴が調子に乗って暴れ出したじゃないか
605 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:59:18 ] そこは指摘せずにそっとしておく所だろ
606 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 16:54:52 ] abort() if (!p); みたいに書けるようにはならんのか。
607 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:25:45 ] if (!p) abort() ;
608 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:35:50 ] >>606 C++などのほかの言語なんかに手を出さず、一生perlを使い続けるべきだと思います。
609 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:42:02 ] perlではif文を後に書くのか?
610 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:56:39 ] >>596 言語の文法は最小限でライブラリで拡張できるほうがいい。
611 名前:598 mailto:sage [2010/03/06(土) 18:17:05 ] すいません嘘です
612 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 19:54:49 ] abort() if(!p) else exit(); とか普通に書きたいんじゃないの?
613 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 19:55:27 ] >609 文修飾子という扱いで後ろにも置ける。 if(e) { func(); } func() if e; は OK だけど、 if(e) func(); { func() } if e; はできない。
614 名前:デフォルトの名無しさん [2010/03/06(土) 20:00:36 ] >>613 2種類の書き方があるっていうか、そういうのって分りにくくないのかな? 後に書くということは func(すっげー長い式なんたらかんたらどうのこうの) if e; だと読むときifを読み落としそうだなあ。
615 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:01:35 ] ワケ分からんw C++だと、func() ;も{ func() ; }も、ひとつのstatementなので、ものすごい違和感があるな。 { func() ; } if e ; ができないというのは、ものすごく違和感があるな。
616 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:06:35 ] struct A; struct B{ B( A& ); } A a(); // これとか B b( A() ); //これが 関数宣言にみなされない書き方ないの? A a; B b( a ); とかじゃない方法で。
617 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:09:39 ] >>615 思うに。 { すげーー長い文 なんたらかんたら だらだらだらだら } if e; って読むのに困るよね。 do{}while()でも読みにくいのね。
618 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:22:06 ] do... whileは、まだ、先頭にdoがあるから、「あ、これはdo... while文の始まりだな」と分かるわけで、 それほど読みにくいってほどでもないんじゃないかな。
619 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:23:29 ] >>616 ないよ。
620 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:31:05 ] func() if e; はシンタックスシュガーの一例か? 混乱の割にメリットは感じられない。
621 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:51:51 ] ループの先頭などで、 break if foo continue if bar とかするのは気持ちいい。
622 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 21:14:57 ] だから、perl以外の言語は触らずに perlだけ使ってなよ。
623 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 21:25:16 ] ハ,,ハ (*゚ω゚ ) >>622 お断りします。Rubyも使います。 . (=====) _(_⌒) ) /\ `J  ̄ ̄\  ̄ ̄ ̄ ̄| | ̄ ̄ ̄ | / \  ̄ ̄
624 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:07:59 ] perlで俺シンタックスシュガープリプロセッサ作ればいいんじゃね?
625 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:18:21 ] foreach(int x, std::make_pair(v.begin(), it)) みたいにカンマが含まれても大丈夫なマクロが欲しいです
626 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:57:30 ] >614 Perl には TMTOWTDI(There's More Than One Way To Do It:やり方は一つじゃない)という スローガンがあってな。 >615 Perl では { } は block であって文じゃないんだ。 >620 if (e) func(); ができなくていちいち block 書くのが面倒という事なんだと思う。
627 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:57:49 ] >616 ttp://www.parashift.com/c++-faq-lite/ctors.html#faq-10.19
628 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:36:34 ] あの、ひとついいですか? 僕は現在高校2年生です。そんなぼくにもC++はマスター できます?
629 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:40:22 ] それなりのことはできるようになりますがマスターはそう簡単にはできません
630 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:46:51 ] >>628 それはお前次第やろ
631 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:55:49 ] >>625 C99の__VA_ARGS__が、C++0xに入る。
632 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:23:57 ] double* darray = new double[0]; delete [] darray; のようなことがプログラム中で起こるのですが、問題ありますか?
633 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:25:45 ] >>632 いいえ。何が心配?
634 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:35:02 ] サイズ0だと続けて次に確保したときに、おんなじ場所を確保しちゃうような気がする ダミーで1byteぐらい確保されんのかな
635 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:37:05 ] >>634 ヌルを返したり他のオブジェクトと同じアドレスを返したりしちゃいけないことになってるから、 だいたいの実装がそんな感じ。
636 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 02:15:18 ] 0バイトのオブジェクトは存在できないから標準に従えば1バイト以上確保することになる だがdarray[0]にアクセスすると未定義動作 変なの
637 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 02:27:16 ] void *operator new (std::size_t size) { if(size == 0) throw std::bad_alloc("Fack you!"); return std::malloc(size); }
638 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 02:35:06 ] error: no matching function for call to 'std::bad_alloc::bad_alloc(const char [10])'
639 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 07:00:01 ] "C++"で、依存関係を解決するためにインターフェイス指向な設計に取り入れるってこと多いかなぁ? テンプレートではなく、仮想関数を使う方法で。
640 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 07:00:33 ] s/設計に/設計を/
641 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 07:09:36 ] >>639 あると思うよ。 今の時代だとクリティカルな部分さえ最適化できればいいから動的型付けに対してそんなに神経質になる必要も無い。 ソフトウェア工学から見たある程度の規模からの開発のし易さや動的な依存関係の解決には仮想関数が向いているし テンプレートを用いた静的な型レベルの解決なら実行速度に対する最適化が向いている。 臨機応変に適材適所できるからC++が選ばれる、何てこともあるね。 強い動的型付けな言語(Rubyとか)になっちゃうと融通が利かないし。 でもRubyとかを採用する現場では速度低下の弊害より人材のコスト考えてる場合ばおおいね
642 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 08:52:23 ] >>639 俺はよく使ってる。 継承を使う時は、純粋仮想関数のみで構成されたクラスの継承がほとんど。 テンプレートを依存関係を解決するために使うのは、本当にテンプレートが効果的かよく考えてやった方がいいと思う。
643 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 09:44:55 ] >>634 コンストラクタで malloc() を呼ぶと malloc(0) でも8バイトぐらいは確保される。 ここらへんは Cライブラリの実装次第だが、 あとで realloc()/free() に渡す可能性があるポインタということを 考えると0バイトであってもユニークなポインタが返されるべき。
644 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 10:48:18 ] templateを使った依存関係の解決ってどういうの?
645 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 12:20:35 ] >>644 class Hoge { void foo() { fuga_.(this); } Fuga<Hoge> fuga_; } 俺はこんなのを想像した。これは相互参照か? 単に特定のクラスに依存したら拡張性がなくなるから、テンプレート引数で指定できるようにしたいという事かもしれない。
646 名前:645 mailto:sage [2010/03/07(日) 12:22:14 ] 2行目訂正 void foo() { fuga_.bar(this); }
647 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 12:30:42 ] こういうのを相互参照って言うんじゃないか class b; class a { b* bb; }; class b { a* aa; };
648 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 12:59:32 ] 多態性を持ちつつどこかに保存しなければならない場合にはインターフェース(か、型消去)を使うかな でも保存する必要が無い関数の引数とかだったらテンプレートの方がいいと思う 例えば標準のアルゴリズムをテンプレートじゃなくてインターフェースで解決しようとしたら結構めんどくさいだろう std::random_access_iterator_interfaceみたいなのが沢山作られて、それを適切に継承してないイテレータは対応アルゴリズムが使えない みたいな感じで、行儀はいいんだけど、すごいめんどくさくなる
649 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:00:23 ] 理想的には継承と多相は独立した概念なんでしょうね。 要求される振る舞いが出来ることを保証する仕組みの一つが 継承であるだけで。
650 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:10:37 ] いわゆるダックタイピング
651 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:40:10 ] >>649 多相を実現する手段の一つが継承
652 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 18:35:47 ] ダックタイピングはコンセプトがあればなぁ
653 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 18:50:34 ] せめてコンパイラのエラーメッセージがわかりやすくなれば
654 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 23:48:11 ] スマポのお勉強してるんですが キャストってどうやって実装してるんでしょうか? class hoge : public fuga; void test(const oreore::unique_ptr<fuga> &p); oreore::unique_ptr<hoge> p(new hoge); test(p); といった感じの使い方を許可したいんですがどうにもうまくいきません 所有権の移動を禁止する方針で作っている(コピー代入を封印)のでキャストするときにテンポラリな値を返せません template <class Other> oreore::unique_ptr<Other> (void) { return oreore::unique_ptr<Other>(*this); // 禁止されてる }
655 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 00:10:08 ] >>654 std::move するんだよ。
656 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 03:22:13 ] >>654 C++0xなら、rvalue referenceが使える。 それ以前のC++では、一応、auto_ptrを実装できるぐらいの方法はあるが、 そのテクニックを学ぶことは、精神衛生上よろしくないので、おすすめしない。
657 名前:デフォルトの名無しさん [2010/03/08(月) 04:21:56 ] >>654 コピー代入を封じるなら無理。 キャストは、元オブジェクトからキャスト先オブジェクトという作るという点では、複製に等しいため。 それこそ>>655 の言うように所有権の移動を許可する方向でやるしかない。 (もちろん所有権が移る以上、本来のキャストとは若干異なるセマンティクスになる)
658 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 07:36:01 ] const_cast ってconstはずしだから <> の中に型書くの無駄だなぁって思ってしまう。 const int* からconstとったら int* に決まってんじゃん、と。
659 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 08:09:18 ] >>658 const_castがオマエの言うような機能だったとして、このコードはどうすればいいんだ? int x = 0 ; int const * const p = &x ; const_cast(p) ; さあどれだ? const_cast<int * const>(p) ; const_cast<int const * const>(p) ; const_cast<int *>(p) ;
660 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 11:12:58 ] template<class vtype> class Test { public: Test( ){ } void func( ); }; のようなクラスのとき、 vtype が P と Test<P> (Pはプリミティブ型) とで呼び出す func( ) を変える方法はありますか?
661 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 11:33:00 ] 特殊化すればいいよ
662 名前:660 mailto:sage [2010/03/08(月) 12:15:01 ] >>661 このようにしたのですが、うまく行きません。。。 template<class vtype> void Test<vtype>::func( ) { cout << "aaa" << endl; } template<class vtype> void Test<Test<vtype> >::func( ) { cout << "bbb" << endl; }
663 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 12:22:01 ] >>662 codepad.org/isjE5LKn
664 名前:660 mailto:sage [2010/03/08(月) 12:39:43 ] >>663 ありがとうございます。 クラスレベルで特殊化してしまうと、メンバ関数が沢山ある場合 同じようなコードが沢山生まれてしまうので 関数部分だけ特殊化できれば、と思ったのですが クラスのところで特殊化しなきゃダメなのですね。
665 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 12:40:57 ] >>664 codepad.org/QzjNzjhA
666 名前:660 mailto:sage [2010/03/08(月) 12:52:05 ] >>665 テンプレートと継承の組み合わせというのは考えられませんでした。 ありがとうございます。
667 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 13:41:10 ] >>655-657 サンクスです キャスト≒複製って知りませんでした 時期標準のソースをチラ見したところ標準もキャストはサポートされてなかったので、uniqueの方はキャスト諦めることにしました
668 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 15:54:42 ] 構造体のメンバ変数を一括で代入する方法ってないんですか? 例えば構造体Aの変数のメンバ変数を全て0にするとか…
669 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 16:26:02 ] struct S { int a, b, c; double x, y, z; static S empty; }; S S::empty = { 0 }; S var; var = S::empty;
670 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 17:44:32 ] サンクス。クラス使わないとダメなんすか?
671 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:03:45 ] pod作る関数を作ればいい。テンプレートで
672 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:05:33 ] struct S { int a, b, c; double x, y, z;}; S a={0}; これで事足りるんじゃ
673 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:14:12 ] >>672 それは代入じゃない。
674 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:17:26 ] あーざっす
675 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:17:34 ] 初期化だ(キリッ
676 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 19:48:52 ] >>659 const_cast<int *>(p)だろ 他のconstが必要なら後で付ければいい 何があかんのですか
677 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:22:05 ] const const_iterator* it; const_cast(it) これはどうなるんだ? const_iteratorはポインタかもしれないしクラスかもしれない
678 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:35:48 ] const_iteratorがconst Type*だった場合、 itの型はconst Type *constでconst_castするとconst Type*になる。 そうでない場合、const_castするとconst_iteratorになる。ただそれだけの話。
679 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:43:53 ] >>676 void const * const * const cpcpc = 0; void ** pp = const_cast<void**>(cpcpc); void const ** cpp = const_cast<void const**>(pp); // このcastはどうすんの?
680 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:54:34 ] >>678 >itの型はconst Type *constでconst_castするとconst Type*になる。 なんでType*じゃないんだ?>>676 と矛盾しない?
681 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:11:07 ] std::complexのconj( )って何でメンバ関数ではなくグローバル関数なのですか?
682 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:15:54 ] 無闇にメンバ関数にするとprivateにアクセス出来てしまうから、 privateにアクセスする必要のない関数は メンバでもfriendでもない関数にするのが良いって 偉い人が言ってた
683 名前:681 mailto:sage [2010/03/08(月) 22:28:24 ] >>682 ありがとうございます。 もし自分がcomplex作ったら、conj( )をメンバ関数にして privateなデータを変更してしまうように実装しそうなのですが これは良くないんですかね?
684 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:34:42 ] そもそも変更することがおかしいんじゃないかい。 メンバ変数にするにしてもconstにするべきだと思う。 共役複素数を求めるだけだよね?
685 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:42:05 ] むしろその程度の軽い型なら不変型にしちゃった方が
686 名前:681 mailto:sage [2010/03/08(月) 23:02:53 ] >>684 イメージ的にはこんな感じです。 myComplex<double> mc0(2,2); // 2+2i mc0.conj( ); // 2-2i グローバル関数にするとコピーが発生してしまうので 良くないのかなぁ、と思ったのですが。
687 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:14:08 ] 実測した訳じゃないが、 あまり効果なさそうな気はする。 コードを見やすくしたほうがいいんじゃないだろうか。
688 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:28:29 ] なんで配列はイニシャライザリストで初期化出来ないんですか?
689 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:50:50 ] C++0xにご期待ください
690 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 01:16:28 ] >>679 const増やすのはstatic_castでもreinterpret_castでも出来る お好きな方で
691 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 01:19:23 ] >>690 キャスト無しで通っちゃうよ。
692 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 01:28:37 ] >>676 void f(void const* a[]); // const 一個付け忘れてるけど変更できない外部ライブラリ void f(void* a[]); // 同上、ただし非 const データを対象とするオーバーロード // ここから自前のコード void g(void const* const a[]) { f(const_cast(a)); // 上のオーバーロードに渡したいのに下のほうにいっちゃう } こわくね?
693 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 02:23:22 ] まあconst_cast使うなってのが基本だから それを書きやすくするうえに他のキャストと違う形になる 省略記法なんて認められないと思われる
694 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:04:10 ] >>690-691 うちのVC++2008EEではconst_castかC style castでないと通らないんだけど、 なんかおかしいのかな。
695 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:21:42 ] どうせ<>書いてないとか
696 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:26:55 ] 通らない ttp://codepad.org/d4Wo3ozT
697 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:48:53 ] void ** const cpp = static_cast<void **>(pp); えっ?
698 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:49:47 ] >>696 それは、規格の文面によって、明示的に禁止されている。 4.4 Qualification conversions [conv.qual] なぜできないのかというと、それを用いることによって、const性に穴が生じるから。 規格のサンプルコードを、適当にコメントを補って引用すると、 int main() { const char c = ’c’; char* pc; const char** pcc = &pc; // 仮に、これが許可されているとする *pcc = &c;// ppcを介して、pcを変更している。 *pc = ’C’; // pcはconstでもないのに、constなはずのcを参照出来ているので、変更できる。 } つまり、constなppcを介して、非constなpcを変更できてしまうので、 pcが、明示的なキャストもなしに、constなオブジェクトを参照することが可能になってしまう。
699 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:57:03 ] >>698 規格の参照までしていただいて、ありがとうございます。 参考になります。 ということで、これを踏まえて改めて>>679
700 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:57:31 ] ubuntu の gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9) 環境で例外クラスの実装を見ようと思ったのですが /usr/include/c++/4.4/stdexcept に logic_error などの宣言はあるのに実装が書いてありません。 どのファイルを見たら良いでしょうか?
701 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 08:07:03 ] const_castの話してるやつはコテ着けるか 婉曲表現と皮肉をやめて直接主張しろ 何人かいて訳が分からない
702 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 08:40:34 ] はがす時は全はがしが楽じゃね?ってことが基点となっていると思うので void const * const * const cpcpc = 0; void ** pp = const_cast<>(cpcpc); // 全はがし void const ** cpp = const_cast<void const**>(pp); // つける時は書く // void const ** cpp = const_cast<void const**>(cpcpc); // 一部はがしのときもこれまで同様書ける というのを望んでんのかも
703 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 09:06:33 ] がんばれ 658 :デフォルトの名無しさん :2010/03/08(月) 07:36:01 const_cast ってconstはずしだから <> の中に型書くの無駄だなぁって思ってしまう。 const int* からconstとったら int* に決まってんじゃん、と。
704 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 14:09:06 ] constの話で盛り上ってるからついでに聞きたいんだけど struct X { int *p; void test(int x) const { *p = x; } }; こう書くとconst指定してるのにオブジェクトの内容が変化してる これって合法なの?
705 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 14:14:13 ] >>704 Xのオブジェクトはpであることを思い出せ。 pはint*型だから「int型の値のあるメモリの位置」を指している。 *p = xは「pの指している先のint型の値に対する副作用」であって「pに対する副作用」ではない。
706 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:34:24 ] pは宝の地図 *pは宝の中身 Xのメンバはpつまり宝の地図 だからtest(int x) constとは宝の地図を書き換えちゃいけないってこと *p = xは宝の中身を入れ替えているだけ
707 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:39:05 ] 中々面白い例え方をするな。
708 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:54:36 ] **pは宝の地図の在り処を書いた地図か。判りやすいね。
709 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:57:01 ] ゲームのお使いクエストだな。 そのお宝の例えは俺は結構好きだな。
710 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:19:18 ] へー、いい表現じゃん
711 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:23:11 ] サンクス 正常な動作だったのね
712 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 17:43:29 ] new intは新しく宝を作るが、この式自体は新しく作られた宝のありかを示す地図を返す。 new int*は宝の地図を新しく作りその地図のありかを返す式だが、新しく作られた宝の地図には宝のありかは書いてない。 難しいな。
713 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:38:02 ] new int*なんてあんの? あるなら知らなかった。
714 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:44:58 ] 型なら何でもnew出来るだろ
715 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:46:35 ] 関数型もできるっけ? 関数ポインタじゃなくて。
716 名前:706 mailto:sage [2010/03/09(火) 21:01:33 ] 何の気無しに書いたんで、反応あって驚いてる。 >>706 は、一番最初にポインタを勉強する時に俺が(たまたま)イメージしたもので、 今にして思うと、地図という「質量を持った物体」でポインタを喩えたのが好都合だった気がする。 たまたまそういうイメージをしたお陰で、ポインタもまた「そういう値」である、って所で まったく混乱せずに済んだ。>>708 が言うように、ポインタのポインタも 「勇者は宝箱を開けた。なんと宝の地図を見つけた!」ということだと考えれば楽だったし。
717 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 22:24:46 ] C++は勉強するほど自信がなくなっていくな・・・boostマジキチ
718 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:10:15 ] >>716 初心者には分かりやすい言い例えだね。 俺もそれ使わせてもらいます。
719 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:24:34 ] 住所とか例えるより絶対わかりやすい。
720 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:30:25 ] >「勇者は宝箱を開けた。なんと宝の地図を見つけた!」 あるあるw
721 名前:デフォルトの名無しさん [2010/03/09(火) 23:38:31 ] ポインタを宝箱に例えるなら、中身の種類は開ける前から判っているんだが
722 名前:デフォルトの名無しさん [2010/03/09(火) 23:38:54 ] s/宝箱/宝箱の地図/
723 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 00:06:18 ] で?
724 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 00:35:08 ] ヌルポインタはミミックだな 開けると死ぬ
725 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 01:44:47 ] 住所にたとえるのと変わらんと思うがね
726 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 01:46:21 ] ていうか別に喩えなくても分かるから
727 名前:デフォルトの名無しさん [2010/03/10(水) 01:46:56 ] ミミックは固定ボスだから、地図が読めない奴が初見殺しされるだけだろ
728 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 04:46:42 ] minorという変数がプログラム中にありますが、 cstdlibをインクルードしたら以下のようなエラーが出るようになりました。 error: macro "minor" passed 2 arguments, but takes just 1 これは単純に、minorという変数名を使うな、という解釈でよいでしょうか?
729 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 04:58:04 ] >>728 どう読んだらそんな解釈になるんだよ。 そのエラーが再現する最小ソースを作ってみれ。
730 名前:728 mailto:sage [2010/03/10(水) 05:25:53 ] >>729 言葉足らずでした。 上記のエラーは、 ctdlib の中(もしくはcstdlibがインクルードしているファイルの中)に 引数を1つとるminorというマクロ(?)があるから、 引数が2つある自作クラスのオブジェクト名をminorにしてはいけない ということでしょうか? 以下ソース #include <cstdlib> class Hoge { public: Hoge( int i, int j ){ } }; int main(int argc, char* argv[]) { Hoge minor(1,1); return 0; }
731 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 05:36:58 ] >>730 別に言葉足らずじゃない。>>729 が寝ぼけてるだけ。 環境によってはsys/types.hにminorマクロがあるので使わない方がいい。
732 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 05:43:19 ] >>731 ありがとうございます。
733 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 05:56:50 ] >>730 手元の Cygwin g++ 4.3.4 では何事もなくコンパイルが通ったよ。 ちなみに >728 の環境(OS、コンパイラ、そのバージョン)は何?
734 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 06:01:57 ] >>731 cstdlib のインクルードでユーザーが使える名前がマクロ定義されてるのは コンパイラのバグ(標準違反)だと言ってしまっていいと思うんだけど、そういう 予防しとかないといけないものなの?どっかの環境での常識?
735 名前:728 mailto:sage [2010/03/10(水) 06:04:13 ] >>733 Ubuntu 9.10 gcc version 4.4.1 です。 gcc -v の内容全部貼ると Using built-in specs. Target: i486-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.1-4ubuntu9' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu Thread model: posix gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)
736 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 06:14:04 ] -std=c++98 とかすれば逃げれたりするんじゃないかなー。 まぁ #undef すりゃいいんだけどね。
737 名前:728 mailto:sage [2010/03/10(水) 06:35:01 ] 以下のソースコードコンパイルすると #include <cstdlib> void minor( int i, int j ) { } int main(int argc, char* argv[]) { return 0; } test.cpp:5:26: error: macro "minor" passed 2 arguments, but takes just 1 test.cpp:5: error: variable or field ‘minor’ declared void test.cpp:5: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x というerrorと、warningが出ます。 >>730 のソースコードではwarning出ませんでした。
738 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 09:54:54 ] functionってすげいな ソース眺めるだけで勉強になる
739 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:43:07 ] struct A; struct B{A a;}; struct A{int a;}; int main(){return 0;} 前方宣言したら、後で定義してれば 使えると思ってたんですが これがエラーになります Bの中をA* aにするとエラーが消えるのですが その辺に理由があるんでしょうか?
740 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:53:13 ] ちょっと実験してみたところ、前方宣言って思ったほど強くない?んですね Aのデータは定義されるまでは全く参照出来ないのか struct A; struct B{void f(A *a){}}; //セーフ //struct B{void f(A& a){}}; //セーフ //struct B{void f(A a){}}; //アウト //struct B{void f(A& a){a.a;}}; //アウト //struct B{void f(A* a){a->a;}}; //アウト struct A{int a;}; int main(){return 0;}
741 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 18:01:37 ] サイズがわかってるかどうかで判断できるよ
742 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 19:10:29 ] なるほど、セーフなのはアドレスですもんね ありがとうございました
743 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:23:35 ] >>738 しかしそんなソースを仕事で書いたら 同僚に白い目で見られそうだww
744 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:40:04 ] すみません vectorのresizeでサイズを大きくした時に 拡張した結果メモリの再配置が起こったとすると resizeする前のデータはコピーされるのでしょうか?
745 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:42:12 ] ざれます
746 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:43:10 ] >>744 www.fides.dti.ne.jp/~oka-t/cpplab-vector-new.html
747 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:43:18 ] ありがとうございます><.
748 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 00:56:34 ] クラスを使ってプログラミングする場合、main関数はどのように使用すればいいのでしょうか?
749 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 00:59:17 ] 普通に使用すればいいです Javaみたいにどっかのクラスのstatic関数にする必要はなし、というか無理
750 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 01:51:16 ] オペレータオーバーロードの ->* って、どう定義してどう使うんですか? ググール先生に聞こうと思ったんだけど記号検索できませんでした
751 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 01:55:22 ] ttp://homepage2.nifty.com/well/Operator.html#arrow_ast
752 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:06:36 ] 結合力最強の二項演算子なので マクロとかで細工するときに便利なこともあります
753 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:24:57 ] >>751 どうもです しかしなんだこれって感じですね ポインタエミュレートのために (myp_hoge->*(&MyPtr<hoge>::Func))(a, b, c); といった形で使いたいんですが、定義の仕方が分からないです(->なら簡単なんですが・・・) >>752 そういう特殊な使い方ってよく思いつくもんですよね
754 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 03:03:47 ] >>748 徹底したクラス指向で行くならこの程度のものになる。 int main() { MainClass m; return m.main(); }
755 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:20:39 ] int main() { return MainClass()(); } 徹底するならこうだろーと思った俺はそろそろ寝るべきか
756 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:51:32 ] operator RESULT(); //用意するだろ普通
757 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 16:29:37 ] throwでint投げると問題があるようなことを聞いたのですが、 どんな問題があるんでしょうか? ポインタでキャッチしてしまうとか?
758 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 16:33:36 ] 受け取る方はみんなstd::exceptionを継承してて欲しいなーって思ってるから
759 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 16:44:47 ] なるほど。よくわかりました。
760 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 17:01:56 ] istringstream の putback って何回でも呼んでおk?
761 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 21:28:31 ] boost::functionとstd::functionって混在しても問題ありませんか? それともどちらか一方にすべきでしょうか?
762 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 21:54:55 ] 混在させたこと無いからわからんけど、大丈夫じゃね? どっちも最終的にはただの関数オブジェクトになるわけだから boostのほうにstdのfunctionを代入することも逆もできるはず 名前は名前空間があるからかぶるわけないし
763 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 22:54:37 ] ABI互換性は?
764 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:03:33 ] 混在といっても、ひとつのコンパイラでコンパイルするんだからABI関係なくね?
765 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:15:46 ] namespace boost = std ;
766 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:28:03 ] ありがとうございます。 今のところはboostが使えるならboostが無難かと 思うのでboostにします。
767 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:34:01 ] >>766 えぇーーー 普通は逆でしょ 標準で済むなら標準を使うのが筋でしょ
768 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:38:24 ] >>767 std::function はまだ標準じゃないでしょ。
769 名前:767 mailto:sage [2010/03/11(木) 23:40:20 ] >>768 そりゃそうだ boost と std だけ見て function を見てなかったよ
770 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:48:14 ] >>766 も「今のところは」って言ってるしな。
771 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 01:27:32 ] placement newを使わずに、任意のメモリ領域にコンストラクタを呼ぶことは不可能?
772 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 01:30:56 ] >>771 何がしたいのかわからないけど、コピーでいいなら std::allocator::construct() とか std::uninitialized_copy() とかが使えるんじゃない?
773 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 10:16:48 ] template <class T> void Caller( T &f ){ f(); } に対して、 void Callee(); があり、 Caller( Callee ); // これだとコンパイルが通るのに、 Caller( &Callee ); // こっちは通らない のはなぜですか?
774 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 10:40:58 ] codepad.org/WzrQ1BNa それはポインタだからさ
775 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 20:32:25 ] 関数の引数に配列の参照を渡したいんですが、どうすればいいですか
776 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 20:54:16 ] >>774 サンクスです。 T &fは「関数の参照型」と言えばいいんでしょうか? また、関数ポインタを呼ぶ際は、 (*f)(); //デリファレンスあり f();//なし 2通りで呼べますが、これはシンタックスシュガー的なものですか? どっち使ってもOKですか?
777 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 20:54:42 ] template<typename T, size_t N> void func(T (&x)[N])
778 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:39:50 ] typedef std::deque<int>::iterator iterator; iterator tekitou; //... tekitou == iterator(); //tekitouに代入処理がなかったらtrue を期待して組んでたら例外が発生してパソコンが爆発したんですけど tekitouがデフォルトコンストラクタ走ったまま何も触られて無いかどうかを判定する方法はありませんか?
779 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:52:18 ] >>778 パソコンが爆発するプログラムを作っているんだったら いますぐやめなさい。
780 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:53:54 ] パソコンが爆発するプログラムを作っているのではありません。 パソコンが爆発するのを防ぐプログラムを作っているのです。
781 名前:デフォルトの名無しさん [2010/03/13(土) 01:15:50 ] 爆発させるプログラムにも実に巧妙なメカニズムがあってだな・・・
782 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:17:30 ] 兎に角、例外が発生してプログラムが正常に動作しないと爆発を防ぐ事ができないのです。 ご教示いただけないでしょうか?
783 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:20:26 ] 判定する方法は無い ポインタと違ってイテレータにはNULL入れられないからねぇ int *ptr = 0;
784 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:21:45 ] 本当に爆発するというなら、 本題なんてどーでもよくて、爆発させる方法を知りたい気すらする。
785 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:22:35 ] bool変数でも使って対処しとけ
786 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:24:23 ] std::pair<iterator, param>ってしてたけどSTLがクソ過ぎてstd::pair<std::pair<iterator, bool>, param>って書かなきゃいけなくなったわ・・・
787 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:25:48 ] こういうときは boost::optional だっけ?
788 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:26:47 ] つtuple
789 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:30:12 ] end()をNULL代わりにしたらあかんの?
790 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:32:49 ] 今回もそうでしたが、コンテナを特定できないとそれは使えません。
791 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:55:44 ] じゃあNULL用の適当なコンテナ作ればいいじゃん
792 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:58:30 ] std::pair<iterator, param>ってしてたけどSTLがクソ過ぎてstd::pair<std::pair<iterator, dummy_container>, param>って書かなきゃいけなくなったわ・・・
793 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:59:08 ] nil使えよ
794 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 02:06:15 ] iteratorがコンテナと関連付けられてるかチェックしたいってことなのかな? わざわざややこしいことやってるように見えるけど
795 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 02:43:02 ] namespace boost { namespace detail { struct none_helper{}; } typedef int detail::none_helper::*none_t ; } // namespace boost namespace boost { none_t const none = ((none_t)0) ; } // namespace boost このコードはいったい何をしようとしてるわけ?
796 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 02:55:22 ] ググった?
797 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 04:11:26 ] >>795 他のどんな型からも自動変換されないし、 他のどんな型へも自動変換されないような変数を定義してるんじゃね?
798 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 06:23:39 ] >>468 といい>>778 といい、最近のPCは爆発しすぎだな
799 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 06:27:14 ] 俺のPCは蒸着するぜ0.05秒で。
800 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 06:52:58 ] 手荷物どころかそのうち航空貨物での取り扱いも断られる
801 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 07:31:03 ] そして単純所持禁止へ
802 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 07:33:53 ] コンピュータが爆発するって 昔の映画や漫画によくあったな
803 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 07:52:27 ] 「映画の中のコンピュータ」って ジョークがあったな
804 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 08:20:38 ] 「なお、このPCは自動的に消滅する」
805 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 10:22:54 ] >>799 あれってさリュック背負ってたりするとセムシ形状に成ったりするん?
806 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 12:27:14 ] >>795 なんだこれ超ムズイじゃねぇか。
807 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:03:28 ] pointer to memberって使ったことあんましないからわからんけど ほかのpointer to memberじゃないとキャストできない(void *にreinterしても変換できなかった)から他の型と比較できない なおかつメンバが空だからnullしか入れるものがない したがってただひとつの状態を持てるってことかな C++ってこういう気持ち悪いバッドノウハウ多すぎるよね すなおに仕様でnil型導入すればいいのに
808 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:26:04 ] 一般的な実装上の都合からいうと、 メンバへのポインターは、単なるオフセットに過ぎない。
809 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:30:01 ] null_ptrをお待ちください
810 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 17:15:12 ] >>807 実装上の都合を言語ユーザに押し付けてる感はあるな
811 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:14:16 ] >>810
812 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:16:22 ] ごめん、途中で送信してしまった。 >>810 他の言語はともかく、 余計なオーバーヘッドを嫌うC++なら、こういう制限も許される(むしろ歓迎される?)よね。
813 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:38:24 ] >>810 型変換については妥当な話だと思うし、 nil の不在は実装上の都合ではないだろうし、 何のことを言ってるの?
814 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:11:09 ] void Test(int *array) { // ごにょごにょ(配列の長さについては考えないとする) } みたいな関数があったとき、 int array[3] = {0,0,0}; Test(array); はコンパイルできるのに、 Test({0,0,0}); はコンパイルできない。 配列に付ける名前が不足しちゃうのでなんとか名前を付けずにやりたいんだけど、 良い手段ない? それともなんでもいいからとりあえず名前を付けざるを得ないんだろうか。
815 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:18:13 ] 名前付けないと可読性下がりそう
816 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:21:19 ] >>814 C++0x をお待ちください。 名前が不足するとかいうのがよくわからんが、マクロでスコープきったり、必要なら __LINE__ あたりとくっつけとけばよかったりしない? C++0x 全部じゃなくても、 gcc みたいに C99 の機能が取り込まれてるコンパイラなら ↓こんなのが使えたり。 void Test(int *array); #define TEST(...) do { int array[] = __VA_ARGS__; Test(array); } while(0) void Tests() { TEST({1,2,3}); TEST({4,5,6}); TEST({7,8,9}); }
817 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:22 ] 可変長引数マクロ関数使えるのか
818 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:36 ] >>814 ヘルパー関数を使って、 std::vector<int> make_vector(int num, ...); Test(&make_vector(3,0,0,0)[0]); とか、 Test((int*)"\x00\x00\x00\x00""\x00\x00\x00\x00""\x00\x00\x00\x00""\x00\x00\x00\x00"); などの悪手しか思いつかない。
819 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:59 ] 配列リテラルとかLL出身者っぽい要望だなぁ
820 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:31:05 ] >>816 レスありがとうございます。 > 名前が不足するというのがよくわからん Testを沢山呼ぶんですよ。 それで、 int array1[3] = {0,0,0}; Test(array1); int array2[3] = {0,0,1}; Test(array1); int array3[3] = {0,0,2}; Test(array1); 以下大量に。 (実際は配列の中身はもっとぐしゃぐしゃで、規則性はないデータになる) __LINE__をつけるというのはいいですね。 >>818 レスありがとうございます。 STL不勉強のためすみませんが今はちょっとよくわかりません。 >>819 はい・・・LL出身です・・・。 とりあえず__LINE__くっつける方法で行きたいと思います。ありがとうございました。
821 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:31:50 ] >>820 なんかTestの引数が全部array1になっちゃってますが、 2回目はarray2、3回目はarray3です・・・。
822 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:36:44 ] C99にはズバリの機能(複合リテラル)があるのだが、C++0xに入るとは聞いていない。 Test((int[]){0,0,0});
823 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:37:24 ] 二次元配列にすればいいだけなんじゃない int arys[100][3]; for(int i=0;i<100;++i){ arys[i][0]=0; arys[i][1]=0; arys[i][2]=i; test(arys[i]); }
824 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:40:22 ] >>822 std::initializer_listが入る
825 名前:814 mailto:sage [2010/03/13(土) 21:41:00 ] >>823 >>820 でちょこっと書きましたが、実際には配列のデータはもっとぐしゃぐしゃで、 必ずしも arys[i][0]=0; arys[i][1]=0; arys[i][2]=i; となるわけではないのです。 質問のために簡略化しているので・・・すみません。
826 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:44:44 ] それなら読み込めばいいんでは? int arys[100][3]; for(int i=0;i<100;++i){ cin >> arys[i][0] >> arys[i][1] >> arys[i][2]; test(arys[i]); } これは標準入力だけど、別にファイルからでもいいし
827 名前:814 mailto:sage [2010/03/13(土) 21:50:09 ] >>826 そうした方がいいでしょうかね・・・大量のデータをソースコードにべた書きするのは よくないかなぁと思ったんですが、 データをあまり見られたくないんですよ。 それで、別ファイルにするよりはソースコードに埋め込んだほうがどちらかというと 見られにくいかなぁと思ったので。 別にソースに埋め込んでも見ようとすれば見れるのでなんてことはないんですが。
828 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:54:44 ] 慣れたLLでコードジェネレートしればいいじゃない
829 名前:814 mailto:sage [2010/03/13(土) 21:57:51 ] >>828 なるほど、考えてみます。ありがとうございます。
830 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:58:14 ] >>827 __VA_ARGS__ は使えんのか? >>816 にあるやつ。
831 名前:814 mailto:sage [2010/03/13(土) 22:02:11 ] >>830 Visual C++ 2008なので使えると思います。 考えてみます。
832 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:04:48 ] >>820 int *arrays[] = { { 0,0,0 }, { 0,0,1 }, { 0,0,2 } }; みたいなのじゃダメなの? argv と同じやりかた。
833 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:07:18 ] >>832 コンパイルしてみてから言おうな。
834 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:14:19 ] めんどくせw
835 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:19:38 ] >>816 __LINE__とくっつけたとして、どうやって参照するの?同じ行が前提?
836 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:50:27 ] >>835 同じ行に書くか、ひとつのマクロ内であれば問題なく使えるでしょ。 この場合は単にスコープ分けるだけでも済みそうだし、 __VA_ARGS__ が使えるなら >816 のやつがいいと思う。
837 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:58:41 ] つーか規則性の無いグシャグシャなデータにしたのがそもそも間違いだろ。なんで誰も突っ込まないんだよ データってのは規則正しい形式なのが当たり前で、規則正しいからこそコードを簡潔に記述できるんだよ struct Recode { int num[5]; char str[80]; }; Recode recodes[N] = { {〜}, {〜}, }; for(int i = 0; i < N; ++i) Test(recodes[i]); こんな感じに書くのが基本に忠実な答え まずはデータ形式から見直そう
838 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:08:15 ] >>837 int の配列って言ってるだろ。十分なデータ構造じゃないか。 規則性がなくてぐしゃぐしゃなのは配列の中の値だろ。
839 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:20:29 ] (データ長+データ実体)*nを1次元配列で持つとか
840 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:24:19 ] 質問のために簡略化してるって構造のことじゃなくて値のことだったのか? だったら二次元配列を使おう、でおしまいだね。いったい何を悩んでるんだろう
841 名前:814 mailto:sage [2010/03/13(土) 23:52:42 ] Visual C++ 2008ってC99は未だっぽいようです・・・ つまり複合リテラル>>822 も可変長引数マクロ関数>>816 も無理のようです。 >>840 構造も、値も、です。 >>814 にかいたTestは実際はオブジェクトのコンストラクタなのですが、これの定義は CTest::CTest(int Id, const char* Name, const char* Species, const char *Sex, int* Hp_max, int* Attack, int* Speed) : (メンバ初期化リスト省略) {} と、>>814 で挙げました配列は3つ、さらに文字列や整数値が引数にあります。 で、これのインスタンスを5個ほど作る処理を書きたいのです。 多次元配列を用いようとすると、Hp_maxとAttack、Speedをまとめて記述し、IdやName,Speciesなどの値と離れて記述する ことになります。できればインスタンス毎にまとめておきたいのですが・・・
842 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:07:58 ] 実際にどう記述してるのか分からん
843 名前:814 mailto:sage [2010/03/14(日) 00:09:58 ] 一応締切?とさせていただきます。 レスを頂いた皆さま、大変参考になりました。ありがとうございました。
844 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:14:23 ] >>841 じゃあ struct X { int Id; const char* Name; const char* Species; const char* Sex; int Hp_max[N]; int Attack[M]; int Speed[O]; }; X xs[] = { {1, "a", "b", "c", {1, 2}, {3, 4}, {5, 6, 7}} }; では?
845 名前:814 mailto:sage [2010/03/14(日) 00:24:12 ] >>844 メンバ変数のうち、Id、Name、Hp_max、Attack、Speedは親クラスから継承しているメンバなのです。 親クラスが存在するクラスではそういう書き方はできなかったかと・・・
846 名前:844 mailto:sage [2010/03/14(日) 00:28:37 ] >>845 初期化用データの格納用に >>844 の X のような構造体を定義すれば 初期化データをすっきり記述できるんじゃないかってこと
847 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:28:58 ] データ部分は関係ないだろ
848 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:30:13 ] >>827 どれくらい見られたくないのかにもよるけど、別ファイルにしてスクランブルかけた方が見られにくいよ
849 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:35:39 ] >>841 ひでぇ。最初っからそう聞けよ。 >814 みたいにしたせいで無駄なレスがあんなに。
850 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:35:49 ] コンストラクタを一つ増やせってことじゃない?
851 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:37:51 ] >>845 CTest::CTest(const X &init) : m_id(init.id), ・・・ { }
852 名前:814 mailto:sage [2010/03/14(日) 00:38:12 ] >>849 すみません。私の聞き方が悪かったせいで、これ以上続けても私が質問したいことを上手く書けるか分かりませんので、 これで終わりにさせてください。 乱暴なようで申し訳ないのですが、以後レスは致しません。
853 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:38:22 ] warota
854 名前:デフォルトの名無しさん [2010/03/14(日) 00:39:42 ] ┌─┐ |も.| |う | │来│ │ね│ │え .| │よ .| バカ ゴルァ │ !!.│ └─┤ プンプン ヽ(`Д´)ノ ヽ(`Д´)ノ (`Д´)ノ ( `Д) | ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U 〜 〜  ̄◎ ̄ . ̄◎ ̄  ̄◎ ̄ ◎−>┘◎
855 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:41:22 ] gccのC99拡張機能を有り難がって使ってんじゃねーぞ 聞く方が混乱するだけだ
856 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:42:56 ] えっ
857 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:15:29 ] template <int num_of_args> class hoge { void operator () (int a1, int a2, ...); }; num_of_argsに対応してoperator ()の引数の数を変動させたいのですが、特殊化をジェネレートするほかにいい方法は無いですかね?
858 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:22:48 ] >>857 「ジェネレート」がコンパイル以外のプロセスを指しているのなら、 Boost.Preprocessor が いくらかマシな手段となるかもしれない。
859 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:23:52 ] >>857 これじゃダメっすか template<int N> class hoge { void operator()(int a) { BOOST_STATIC_ASSERT(N == 1); } void operator()(int a, int b) { BOOST_STATIC_ASSERT(N == 2); } void operator()(int a, int b, int c) { BOOST_STATIC_ASSERT(N == 3); } };
860 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:26:06 ] >>857 C++0xを、首を長くして待て。
861 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:28:23 ] きりんさんになっちゃいそうです><
862 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:38:21 ] >>857 num_of_argsが要らなくない?無いほうがすっきりしないか?
863 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:55:12 ] 俺もそう思う。 どうせ特殊化で生成するなら、オーバーロードでいいんじゃね?
864 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:07:19 ] >>858 boostはよく知らないんですが後でちょっと探ってきます >>589 これは面白いですね コード生成は避けられんませんが、ちょっとシンプルになりました >>860 待ちきれません >>862 ,863 array<3> a(10, 15, 20); a(1, 5, 3) = 100; こんな感じで使おうと思ってるんで、num_of_argsは欲しいです
865 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:10:31 ] 俺も要らないと思うわ
866 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:13:28 ] なぜ[a,b,c]という演算子がないのかっていう有意義な疑問に帰着するわけね。
867 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:14:53 ] >>866 x[Index(a, b, c)] で代用できるから
868 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:27:47 ] 1次元の配列が作れる。n次元の配列に[a]演算子を適用するとn+1次元の配列が作れるならば、数学的帰納法で無限の次元の配列が作れることが証明できる。 早い話がvector<vector<vector<int>>>だね。
869 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:39:36 ] >>860 g++ 4.4ではもう使える。
870 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:40:37 ] ここ数日の質問って何をしたいのか見えてこないのが多いな
871 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:10:09 ] c++の文法書ってありますか? 書店に行ってもプログラミングの入門書ばかりで 言語仕様の解説書が見つからなくて困ってる 組み込みやる事になってgcc、GNUARM使う事になったんだが 文法がまるで分からん(K&R〜ANSIの頃のCは随分使ったんだが)
872 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:11:27 ] 仕様書読めばいいじゃない
873 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:13:49 ] >>871 JIS規格ならJISのサイトや取り扱ってる書店で発注すれば購入できたり無料で見たりできるお!!!!!!
874 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:16:24 ] >>871 ja.lmgtfy.com/?q=C%2B%2B
875 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:19:23 ] 文法がまるでわからないのなら むしろ入門書のほうがいいんじゃないのかw ってか組み込みならそんなに難しい文法の知識いらないし、 むしろ環境構築の方が面倒な気がするけどね
876 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:22:54 ] >>871 単にCの延長でいいなら入門書読めば事足りるはず。 C++らしいコードが書きたいなら Effective C++とかMore Effective C++でも読んどけば?という感じ。 厳密な文法が知りたければISO/IEC 14882:2003が言語仕様書ということになってるが、 これを読んで特定の目的を達成するコードが書けるとは思えんなあ。
877 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:26:22 ] まぁ気持ちは分かる 入門書だとオペレーターオーバーロードとかnamespaceとかそんなん吹き飛ばして いきなりstd::coutとか使い出すし
878 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:30:29 ] >>877 しかも、その場合、ADLまで絡んでくるしな。
879 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:34:03 ] 俺も昔厳密な仕様が知りたいけど 仕様書とかダルイっていう舐めた態度の時にこの本買った www.hir-net.com/book/book14/index.html >>877 な感じで詰まってるなら入門書と並行してこういう本買ってもいいかもね 最近は色々種類あるだろうし翻訳物もあるだろうから本屋行って選ぶよろし
880 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 04:04:01 ] 組み込みなら組み込みのスレで尋ねた方がいいと思うぜ C++の一般論が必ずしも当てはまるとは限らんから
881 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 12:59:49 ] >>871 組み込みなら C 使えよ。 お前みたいなのが C++ 使うとバグが増える。 とりあえずヘッダ自動生成とかのツール類で 勉強してからにしろ。
882 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:03:01 ] デストラクタもないCにいわれてもな
883 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:06:49 ] >>881 > とりあえずヘッダ自動生成とかのツール類で > 勉強してからにしろ。 何を言っているんだw
884 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:13:53 ] というか、強い静的型付けもないCなんかで書いたら、誰でもバグが増えるわ。
885 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:58:08 ] >>882-884 組み込みは製品になるとスタックダンプとレジスタぐらいしか なくてアセンブラだけで解析すんの大変なんだぜ。 お前らみたいな糞コードのバグ解析がこっちに 回ってきて迷惑なんだよ。
886 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:04:43 ] そういうクソを調教するためにMISRA-Cとかがあります
887 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:29:06 ] >>885 組み込みつったって規模があるだろう それこそメモリが数kbしかないものもあれば、OSが載っているようなシステムだってある 少し極論じゃないのか
888 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:40:51 ] Cでバグが減る根拠を挙げてもらおうか
889 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:46:53 ] 誰もそんな事言ってないから
890 名前:デフォルトの名無しさん [2010/03/14(日) 18:41:27 ] template<typename T> void foo(const T& arg){ if(T::hoge_flag){ func_true(arg); } else{ func_false(arg); } return; } この様なコードがありまして、T::hoge_flagは T型によりコンパイル時に決定されるconst bool型の定数とします。 すなわち T::hoge_flag の真偽によって func_true(arg);とfunc_false(arg);の一方だけが必ず実行され 他方は必ず実行されないことになります。 こういった場合は、テンプレートメタプログラミングを使って 一方だけのコードが実行バイナリファイルに含まれるようにすべきなのでしょうか。 それともコンパイラの最適化を期待して上記のコードのままでも良いのでしょうか。 よろしくお願い申し上げます。
891 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:09:38 ] コンパイラの機嫌しだい
892 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:10:12 ] >>890 最適化に期待すれば十分だと思うよ。 実測してその部分がパフォーマンスに影響することが分かってから改良しても遅くないよ。
893 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:20:20 ] そういう場合テンプレートメタプログラミングを理解できないコンパイラだったら 困る・・・か?そんなバカコンパイラは想定しない方が良いか。
894 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:20:28 ] struct when_true{ inline static void func(arg_t); }; struct when_false { (ry }; if_<flag, when_true, when_false>::type::func(arg); 確実性を考えると↑のように関数化しないといけない 結局のところオーバーヘッドは避けられないからif elseのままでいいよ
895 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:25:09 ] たとえば、 template<bool N> void func(); でN値による特殊化なんかできるのかな
896 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:32:55 ] こんなので切り替えれられるとおも浮けど、わざわざ属性を示すクラスが下からあればいいけど、わざわざ作るなら、ifのほうが分りやすいかもな。 class TypeA{}; class TypeB{}; class hoge :public TypeA { }; class fuga :public TypeB { }; template<class T> void func(const T& obj,typename boost::enable_if<boost::is_convertible<T*,TypeA*>>:type* =0) { } template<class T> void func(const T& obj,typename boost::enable_if<boost::is_convertible<T*,TypeB*>>:type* =0) { } void test() { hoge h; fuga f; func(h); func(f); }
897 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:07:40 ] if文の削除なんてあまりにも可読性が低くなってる場合しかオレはやらないな 速度やコードサイズの最適化なんてたかがしれてるだろ >>896 わざわざややこしくしてないか? それだったらenable_if_cにして直接T::hoge_flagを突っ込めばいいんじゃん typename boost::enable_if_c<T::hoge_flag>:typeと typename boost::disable_if_c<T::hoge_flag>:typeだけで 他にクラスや関数を用意する必要はないはず まあこんなことしなきゃならないほどカツカツなら 他に検討すべき箇所があるんじゃないのかね
898 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:08:46 ] >>895 できるっしょ。 template<bool b> void func(){〜}; template<> void func<true>(〜); これでおkでは?
899 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:44:03 ] もう面倒だからboolじゃなくて関数ポインタででも持たせとけよ。
900 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:50:27 ] 関数ポインタは最適化の障害で(ry
901 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:55:24 ] コストとコードサイズ小さくしたいのにカンポはねーよ・・・
902 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:57:24 ] 結局ifelse書いて最適化に期待するのに落ち着きそうだな 関数化するまでも無い分岐の場合は特にそうだろう
903 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:59:40 ] この状況で関数ポインタ持たせたら 逆効果じゃねぇかwwwww
904 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:00:55 ] コンパイル時に定まるif elseで絶対に実行されないことが 分かる場合、それでも最適化できないバカコンパイラって 知っている? それを最適化できないとなるともっと重大な所でも 最適化できなさそうな気がするが。
905 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:19:48 ] codepad.org/3HNtsPNZ なんでこれが期待どおりに動いてるのかよく分からない
906 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:47:54 ] Conceptさん・・・Conceptさんを呼べ!!
907 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:51:07 ] templateの部分特殊化とSFINAE。 メンバT::swapが存在し、かつvoid (T::*)(T &)が&T::swapに置き換え可能ならば (その場合のみ)has_swap_implの部分特殊化が選択される。
908 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:55:48 ] カードゲームの効果解説かと思った。
909 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 22:40:36 ] >>888 >>871 は C はそれなりに書けるようだが、 解説書見ながら C++ で書いてより高品質なソフトが 書ける理由がないだろ。 どうせ new[] したのを delete するようなコード 書いて地雷仕込むのがオチ。
910 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:18:09 ] >>905 まず、has_swap<T>はどんな型にも適合するのでhas_swap<hoge>の実体化が行われる。 コンパイラはhas_swap<hoge>の基底クラスとして、has_swap_impl<hoge, void>を実体化しようとする。 なお、has_swap_implの第2テンプレート引数は省略されているのでデフォルトのvoidが使われる。 has_swap_impl<hoge, void>を実体化しようとした際に、 コンパイラはまず、より特殊化されたバージョンである 14行目のバージョンに適合するかのチェックを行う。 ここで問題は、typename has_swap_helper<T, &T::swap>::type が void と一致するかどうか。 ・メンバ関数としてvoid T::swap(T&)が存在するならば、has_swap_helperのテンプレート引数が確定し、 かつ4行目のテンプレートに適合するので、4行目のテンプレートが実体化され、voidになる。 すると、has_swap_impl<hoge, void>は14行目のバージョンに適合する。 ・void T::swap(T&)が存在しないならば、適合するhas_swap_helperは「存在しない」。 通常の感覚ならばエラーになりそうだが、 SFINAEの規則によってエラーとはならず、 単に14行目のバージョンが候補から除外される。 コンパイラは次に9行目のバージョンの実体化を行おうとする。 9行目は何でも適合するので、has_swap_impl<fuga, void>は9行目のバージョンに適合する。 あくまでもhas_swap_impl<hoge, void>がどれにマッチするかが問題なので、 たとえば6行目のtypedefをintに変えたりするとダメ (その場合、9行目を class U = int にすればいい)
911 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:20:30 ] っていうオーバーロード解決に至るまでの経過を出力してくれるコンパイラないかなぁ 特殊化とかADLとか絡んでついていけない時がままある
912 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:25:19 ] 言い出しっぺの法則発動
913 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:33:42 ] あ、>>910 間違えてた。 誤) ・void T::swap(T&)が存在しないならば、適合するhas_swap_helperは「存在しない」。 正) ・void T::swap(T&)が存在しないならば、has_swap_helperのテンプレート引数が確定しない。
914 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:34:08 ] #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct TestData { int id; char *name; char *sp; char *sx; int nr_param; char *param; } TestData; #define PARA(max,at,sp) ":" #max "," #at "," #sp static TestData test_array[] = { { 1, "NA", "SpA", "M", 3, PARA(0, 0, 1) PARA(2, 3, 4) PARA(5, 6, 7), }, { 2, "NB", "SpB", "???", 1, PARA(1, 2, 3), }, }; void dump_testdata(TestData *t) { int i; const char *p; printf(" Id:%d, Name:%s, Sp:%s, Sx:%s\n", t->id, t->name, t->sp, t->sx); p = t->param; for ( i = 0; i < t->nr_param ;i++) { int m, a, s; m = atoi(p = strchr(p, ':')+1); a = atoi(p = strchr(p, ',')+1); s = atoi(p = strchr(p, ',')+1); printf(" param: max:%d, attack:%d, speed:%d\n", m, a, s); } } int main(void) { dump_testdata(&test_array[0]); dump_testdata(&test_array[1]); return 0; }
915 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:35:40 ] アンカー消えた。 >>914 は >>852 これくらいしか思いつかん。
916 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:57:05 ] >>907 ,910 どうもありがとう、なんとなくわかってきた なるべく特殊化が強いのを優先的にリストアップして最初に合致したやつを使うということですね
917 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:03:50 ] C++使ってちょうど2年半の者です。 テンプレートメタプログラミングって とても難解そうで ほとんど学んでいないのですが、 例えば>>890 さんの場合ですとどうすればいいことになるのでしょうか。 どなたかコードを(boost::mplのような出来合いのライブラリを 使用せずに)書いてくださいませんでしょうか。 よろしくお願いします。
918 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:19:42 ] >>917 最近、C++を勉強し始めたからテンプレートを勉強していないんだけど こんな難しそうなのを「みんな出きるのか〜」とビビってたぜ あぁ〜安心した
919 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:24:32 ] メタプロはライブラリ作者のためのものと言い切っても過言ではない 知ってても使う場面は実はそれほど多くない(なくても実装できることが多い)し 使える場面だとしてもすでにできの良いライブラリがあるからそっちを使うことになる
920 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:24:39 ] これは静的(コンパイル時)なのか動的(実行時)なのか とかを意識すると多少理解が楽になる
921 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:35:15 ] >>917 boost::mplを使えるようになれば自然と覚えられるよ。
922 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 01:13:45 ] こういうこと言うと否定されるのかもしれないけど TMPって出来合いのライブラリを使うプログラミングだと思う 自分でメタ関数やシーケンスをフル実装してる奴とかいるのかね そういやTMPの本が出版されたんだっけ?
923 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 01:19:46 ] templateでメタプログラミングするのが嫌なら別の方法でメタプログラミングすればいいよ。 template使ってる人は型レベルとの相性が良い(というか型レベルそのものだ)から好きで使ってるだけ。
924 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 05:19:50 ] >>917 自信ないけどこんなんでどうか ttp://codepad.org/jyhjFg0S ところで、こういうのって、boolでやるのと struct true_tag {}; struct false_tag {}; とかを定義してやるのと、どっちがいいんだろ?
925 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 06:57:33 ] >>917 これでいいっしょ。 template<typename T, bool b> void foo_impl(const T &arg) { func_true(arg); } template<typename T> void foo_impl<T, false>(const T &arg) { func_false(arg); } template<typename T> void foo(const T& arg) { foo_impl<T, T::hoge_flag>(arg); } まあTMPなんて必要性が感じられなければ無理に使うような物でもないと思うよ。 付け焼刃の知識では早々使えるコードが出てくることもない。 何に使えるのかわかってからでも使い始めるのは遅くない。 まずは既存のコードでどう使われているのか観察することだな。
926 名前:917 mailto:sage [2010/03/15(月) 10:53:59 ] みなさんありがとうございます。 C++0xではテンプレートメタプログラミングをサポートするためだけにあるような 機能が増えると伺っておりましたので、そろそろ勉強し始めるときが 来たような気がしています。
927 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 12:28:21 ] >>922 そうだとおもう。テンプレートは作るのは地獄だけど、使うのは楽になるように作るように心がけてる。 関数テンプレートなんか型推論で殆ど型引数を書かなくてすむのに正しいコードが出るんだから、丁寧に作った関数テンプレートは使う側にとって大きなメリットがあると思う。
928 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 13:17:19 ] >>927 お前はテンプレートメタプログラミングってなんだか理解しているのか? > 関数テンプレートなんか型推論で殆ど型引数を書かなくてすむのに > 正しいコードが出るんだから、丁寧に作った関数テンプレートは > 使う側にとって大きなメリットがあると思う。 >>922 もみんなもテンプレートメタプログラミングの話をしているんだけど。。。
929 名前:928 mailto:sage [2010/03/15(月) 13:18:35 ] ああ、分かった。 >>927 はTMPがTeMPlateの略だと思ってた訳か。 これで文脈が繋がった。
930 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 15:19:03 ] ネットの画像のURLから隠しフォルダ「Temporary Internet Files\Content.IE5」以下に検索をかけてファイルを見つけようとしています。 ファイルは見つかるんですが、a.com/aa.jpg からだとファイル名はaa[1].jpgになっています。 zzzzzz.com/aa.jpg とではファイル名の区別がつきません。Temporary Internet Filesのファイルをプロパディで 見るとURLの情報が解るのですが、この情報を参照できるような関数や方法ってありませんか?
931 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:08:24 ] 環境依存OKなスレで聞きなよ
932 名前:930 mailto:sage [2010/03/15(月) 17:21:02 ] >>931 もしかして自分だけですかね?Temporary Internet Filesの特性かと思っていました。
933 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:31:05 ] それで?C++という言語の何を訊きたいの?
934 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:35:21 ] return static_cast<931::環境依存>(930の悩み); //invalid static_cast form type "932.オレだけ?" to type "世界平和"
935 名前:930 mailto:sage [2010/03/15(月) 17:52:06 ] C++で作って詰まって短絡的に聞いてしまいました、すみません。 D:\Temporary Internet Files\Content.IE5を見たところindex.datがあるので、ここでファイルとアドレスを関連付けて \Temporary Internet Filesに表示させてる? datをC++で読み込んで目当てのファイルを見つけることは可能でしょうか?
936 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:01:30 ] _,,_ /´o ヽ ,.ィゝ l  ̄ヽ l l ヽ___ / ,,...---`ニニニ==、,,__ l / ヽ ヽ ヽ ヽ ヽ ヽ ヽ l三三三> | iヽ ヽ ヽ ヽ ヽ ヽ ヽ/三三/''ー- 、 ヽ. ヽ、ヽ ヽ ヽ ヽ ヽ.∠三=‐''´>‐--‐' ヽ、`'''ー‐---‐'''´_,,...--‐'''´ `''ーッ--t_,r'''´ _/._/
937 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:33:35 ] >>935 そうでなくて、Windowsという環境依存なプログラムについては「環境依存OKなスレで聞きなよ」ってことでしょ
938 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:56:25 ] >>930 【初心者歓迎】C/C++室 Ver.71【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1264774545/l50
939 名前:930 mailto:sage [2010/03/15(月) 19:00:08 ] スレチですね。見当違いですみません…
940 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 20:13:17 ] >>925 二つ目のfoo_impl()はコンパイルエラー起こすだろ 関数テンプレートで部分的特殊化は無理
941 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 21:25:05 ] STLのvecterの配列に対してクイックソートを組んだんですが動きません ソース : codepad.org/YM2RidkL 47、48行目の再帰処理のあたりが原因だと思うのですが、誰か助けてください
942 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 21:55:20 ] 勘だけど 43、44行目あたりかな
943 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:01:47 ] 見た感じだと44行目か36行目のどっちかだな
944 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:10:03 ] 見てないけど44行目かな
945 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:14:34 ] どうみても44が--
946 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:45:42 ] >>944 > 見てないけど おいw
947 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 23:16:01 ] >>871 です >>876 ありがとうございます、一番参考になりました 近日中に都会に出かけるのでwあったら立ち読み&購入検討してきます 何度かパーサを書く仕事をしたので、どうしてもライブラリより構文に目が行ってしまいます 最近はそういうの流行らないみたいですね もはやIBM流の構文チャート?やBNFで定義できるような言語じゃないとは 噂で聞いてはおりますが…
948 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:23:47 ] >>941 添え字10のアクセス違反って出てるじゃん m_array[9]に値入れた後にjをインクリメントしてるんだろ >>947 は組み込み自体やった事なさそうな感じ
949 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 02:36:50 ] class hoge { const fuga &f; public: hoge() : f(fuga_sub()) { } }; const参照はテンポラリオブジェクトを束縛すると聞いたんですが、↑のようにするとバグります。なぜなんでしょうか?
950 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 02:37:50 ] fはhogeのコンストラクタスコープでしか生きてないインスタンスをさしてるから
951 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 05:58:00 ] >>948 ええ、組み込みは初めてです 使ってもいいライブラリはサンプル等あるんで問題ないんですが コンストラクタの初期化リストなんて初めて見ました トッパンのC++の本なら昔買いましたが、今更役に立ちませんよねw
952 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 07:58:42 ] >>949 初期化リストで使った場合、コンストラクタの終わりまでしか延命されない。 規格の 12.2 p5 より。 > ... A temporary bound to a reference member in a constructor's ctor-initializer > persists until the constructor exits. ... その特別ルールが役に立つのはほぼ自動変数だけ。