1 名前:デフォルトの名無しさん mailto:sage [2012/05/08(火) 04:55:24.99 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part94 toro.2ch.net/test/read.cgi/tech/1329512856/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.78【環境依存OK】 toro.2ch.net/test/read.cgi/tech/1331894668/ ■長いソースを貼るときはここへ。■ codepad.org/ ideone.com/
490 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 00:27:53.20 ] >>487 vectorの中のメモリ確保失敗は標準C++ではbad_allocなんかの例外で通知されるんだけど、 例外無効にしてる状態で呼び出し元でチェックしようとしたら何かしら標準以外の方法を使うことに なるんじゃないの? >>488-489 vectorやstringではそうはいかないでしょ。
491 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 00:29:39.31 ] >>490 例外未対応の処理系ならabortへ直行
492 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 00:35:15.99 ] GoogleならSTLに頼らない独自の配列クラスとか作ってるらしい
493 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 00:44:25.22 ] >>491 やっぱそうか。ありがとう。
494 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 00:45:33.18 ] まあヌルポにアクセスしちゃうからね
495 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 00:46:14.25 ] >>476 んなこたーない。
496 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 07:20:19.34 ] ヌルポは必ず 0 だよ ビット表現が ~0 だろうが ソース上は必ず 0 で表現する だから >>476 はあり得ない というか (void*) 付きの NULL は C++ じゃなくて C だし >>476 は無茶苦茶やで
497 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 07:29:48.78 ] ~ヌルポ
498 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 10:50:31.28 ] ソースコード上のポインタリテラルの0はNULLとして扱われるが 内部表現が0(0番地)とは限らない //OK int* p = 0; delete p; //NG ただし殆どの環境で問題は起こらない int n = 0; int* p = reinterpret_cast<int*>(n); delete p;
499 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 11:32:04.45 ] そんなもん知ってる
500 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 12:16:01.43 ] C FAQ 読め。んで、そこに書いてあることは繰り返し書かなくていい。 www.kouno.jp/home/c_faq/c5.html
501 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 12:30:10.64 ] それCや
502 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 12:57:36.36 ] 規格票読んでもこの点に付いては同じ
503 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 13:01:32.98 ] 規格にこだわる人に限ってたいしたプログラムを書けない
504 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 13:02:29.84 ] ○○○さんのことかー
505 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 13:08:12.51 ] deleteするのとNULLを代入するのとどう違うんだよ
506 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 13:19:43.41 ] >>503 馬鹿かお前は 規格票は無駄な議論を終わらせるためにある
507 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 13:20:03.68 ] どこが同じなんだよ
508 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 14:39:11.68 ] deleteしてからNULLにしなきゃいけないのはなぜ? 最初からNULLじゃ駄目なの
509 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 14:51:05.54 ] >>508 int *a = new int(0); delete a; a = nullptr; の事?それなら、 int *a = new int(0); delete a; a = nullptr; ... // いろいろな処理 delete a; // 重複delete っていうのを仮にしたとしてもプログラムを落とさせないためだと思う。 でもそれやるくらいならunique_ptr使った方がいいし、これが必要な場面というと 「もしかしたらコードの中途半端な所でメモリ削減のためにdeleteする場合があるけど最終的な終了場面でもdeleteしたい」 っていうそうとうトリッキーで可読性の低い時だから推奨は推奨はしない。
510 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 14:51:43.63 ] 誤字まくりだけど気にしないで。
511 名前:デフォルトの名無しさん mailto:sage [2012/05/31(木) 15:16:43.24 ] >>505 >>508 GCの話・・・なわけないよな
512 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 00:39:38.16 ] >>400 >メモリー不足→new_handler作動→リザーブが足りない→newが例外を出さない→newが0を返す?→異常終了 ないわwwwwww newが例外をスローせずに0を返すのはset_new_handler(0)とした場合(ハンドラ無し)であって set_new_handler()に有効なnew_handlerを設定すれば、メモリ確保に成功するか、 new_handlerから例外を投げるかするまでnew_handlerが繰り返し呼ばれるのじゃ というわけでど素人相手に潰れた漏れの土日を返せよ; ま、漏れの意見を潰したければ、>369の無駄な複雑さに噛み付くべきであった
513 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 00:47:51.29 ] >>422 Fooがバグっていたとして、叫ぶことになるのがFooの作者とは限らん ていうか、std::vector<T>にしても、コンストラクタからTのコンストラクタが呼ばれるわけだが、 その中で例外が発生した場合ときリークしないことが仕様で謳われてるっけ? いちおうVS2008ではリークしないみたいだけど、ようわからんので>376への回答は避けといた
514 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 01:07:08.93 ] >>512 > newが例外をスローせずに0を返すのはset_new_handler(0)とした場合(ハンドラ無し)であって そんな動作しません。 set_new_handler(0) はデフォルトのハンドラを指定していることになるので、普通に bad_alloc が飛ぶ。
515 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 02:06:07.06 ] >>513 > Tのコンストラクタが呼ばれるわけだが、 > その中で例外が発生した場合ときリークしないことが仕様で謳われてるっけ? new TでTのコンストラクタが例外を投げたらTのために確保されたメモリは解放される。 new T[x]でどこかの要素の構築中にTのコンストラクタが例外を投げたら構築済みの要素のデストラクタが呼ばれ確保されたメモリは解放される。 ただしTの内部でコンストラクタの中断でリークがおきるならそれはリークする。
516 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 02:12:02.44 ] >>513 >リークしないことが仕様で リークしたらバグ リークしないためのRAII ideone.com/Z52HM
517 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 06:27:50.13 ] >>512 お前が例外出さない方法があるって言ったから提示してくれた案だろ 痴呆かよ
518 名前:513 mailto:sage [2012/06/01(金) 06:36:18.11 ] しつれい ×: >376 ○: >378 >>514 ありゃ確かにそうかも、、、 // (main()の冒頭で) std::new_handler prevHandler = std::set_new_handler(foo); std::cout << "p=0x" << prevHandler << std::endl; // p=0x00000000
519 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 06:39:59.13 ] >>517 >お前が例外出さない方法があるって言ったから提示してくれた案だろ ┐(´ー`)┌ 気持ちは有難いが、規格準拠じゃない挙動を案と言われても困るな、、
520 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 06:51:04.78 ] ということで結局メモリー枯渇したらnewで例外は避けられん訳だ
521 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 07:25:18.44 ] nothrowしろよ
522 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 08:15:17.43 ] 例外安全にするかabortだろ NULL返す意味ねーよ
523 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 10:10:18.87 ] C++で背景画像とロゴ画像が二つ作ってあるときに ロゴ画像のロゴ以外の部分(何も無い余白部分)を透明にして ロゴ画像の何も無い部分には背景画像が映るようにするにはどうしたらいいんですか?
524 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 10:13:12.39 ] >>523 画像を二枚読んで合成する。 具体的には、 ロゴ画像のとある位置の色が透過色だったら背景色を出力バッファに書き込む。 透過色じゃなかったらロゴの色を出力バッファに書き込む。 それだけ。
525 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 10:30:01.46 ] だからそのやり方を(ry
526 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 10:36:08.00 ] 分かってない人に分かり難く言っても絶対分からない
527 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 10:38:55.07 ] む〜。これ以外にどう説明しようか。 >>524 画像を読むときはファイルオープンして画像フォーマットにそって画素データを読み込む。 画像ファイルフォーマットは数多にあるので対象になるものをググれ。 後は画素を比較して出力バッファに書き込むだけなんだが・・・。 コードがほしいなら宿題スレでお願いしてみるのがいいかもしれん。 あんまりいい方法じゃないけどな。
528 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 10:41:38.98 ] >>523 の内容だけじゃ >>524 ぐらいしか言えないだろw APIも画像フォーマットも謎なんだし
529 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 10:43:34.01 ] できるだけプラットフォーム非依存にするならDeVILで読み込んでOpenGLのテクスチャにして 合成はOpenGL側でやるとかか
530 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 11:19:10.19 ] >>528 用件が解決する方法であればなんでもいいだろ 客先で「画像形式は?」「API使います?」なんて聞くエンジニアは見たこと無い 指定が無いなら勝手に決めればいいこと
531 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 11:22:53.98 ] >>526 このスレではよくあること 理解してても他の人の説明聞くと「えっ?」ってなる
532 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 11:23:40.51 ] 何で客に聞く話になるんだよwアホ杉だろw
533 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 11:31:27.28 ] 質問もせずに独断で決めるエンジニアとか嫌だ 同じチームなら困る
534 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 11:59:26.97 ] 画像形式ぐらいさすがに聞くだろ…
535 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 12:51:38.25 ] 暇でしょうがないから突貫で作ったよ。3時間ではこれが限界。 ttp://www1.axfc.net/uploader/File/so/79537.zip&key=2ch もっと手を抜くつもりだったけど思ったよりかかってしまった。 画像形式はPGMテキストだ!まさに外道。 我を崇めよ〜〜〜。はっは〜〜。
536 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 13:21:30.92 ] カスだった
537 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 13:36:25.45 ] >>536 よく言った。その功績を讃えてすごいサンプルを作る義務をあげるよ。 たのんだよ〜。
538 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 13:38:30.63 ] ヘッダーに定義を書くなよ
539 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 13:46:27.56 ] >>538 テンプレート書いてた時の癖でベタ書きしてしまう。 手抜きの意味もあるんだが、正直スマンカッタ。
540 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 15:29:52.12 ] なにもしないやつほど文句を言う典型例
541 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 16:48:21.33 ] 突貫としても低レベル過ぎ
542 名前:デフォルトの名無しさん mailto:sage [2012/06/01(金) 19:23:02.02 ] >>538 今は、ヘッダー別のプリコンパイルドヘッダーも あって速度も速いんだからいいじゃねぇか
543 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 00:03:30.05 ] >>542 そういう問題じゃないだろ。
544 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 02:49:02.35 ] >>541 腕がないのはしょうがない。仕様だ。 処理が低級っていうだったら、概念を説明出来ればいいかなと割り切ったんだよ。 ま、高尚なライブラリは俺がドキュメント読めなくて使えないんだけどね。 お、俺にもっと能力をくれ・・・。
545 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 04:07:18.14 ] 胸がないのはしょうがない。仕様だ。
546 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 04:09:06.20 ] >>545 きょぬー甘え。
547 名前: ◆QZaw55cn4c mailto:sage [2012/06/02(土) 04:34:28.04 ] >>545 賓乳萌え
548 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 10:53:04.80 ] 貧乳が好きなのは肉体労働者だそうです 頭脳労働者はグラマーが好きな傾向が高いです
549 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 12:15:53.19 ] プログラマーと言いたいようだから先に言っておこう
550 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 12:21:02.95 ] 数学者はたぶん虚乳が好き。
551 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 12:21:38.68 ] このスレおやじばっかw
552 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 12:24:48.04 ] わてはピチピチの女子高生でおまんがな
553 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 13:54:10.94 ] >>551 オヤジはプログラマなんて出来ないよ 連日徹夜でしかも頭の柔らかさを必要とするIT土方だから、定年が35才と言われている それまでに管理職に移動出来ないと悲惨な人生が待っている
554 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 16:03:52.76 ] >>553 確かに力づくでコーディングしている人は体力がなくなると終わりだが、 センスや技術がある人はいくつになってもプログラマできるよ。
555 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 16:40:55.85 ] センスも技術も年で劣化するから・・・
556 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 16:52:31.83 ] プログラマ35歳定年説とか ただのヘボプロブラマだけの話だよ
557 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 17:09:55.44 ] 経験豊富になってダメな囲い込み技術の(未来のどん詰まり具合を)見抜けるようになると その日の飯の種を拾う(3年後には)無駄/死亡と判りきってる学習が億劫に成っちゃうからねー ケツの軽い若い時期しか無理ってのは確かだと思うよ
558 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 17:12:13.66 ] マ板でやれ
559 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 18:14:27.03 ] >>556 お前プログラマじゃないだろ・・・
560 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 19:05:05.40 ] >>559 プログラマだよ まだ35じゃないけど
561 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 19:13:26.54 ] >>555 センスも技術も年で劣化するからダメというのなら、 どんな職業も35歳で定年だな。
562 名前:デフォルトの名無しさん [2012/06/02(土) 19:14:14.71 ] クラスを配列に動的に確保したいんですが hoge *h; h = new hoge(int ho)[size]; とかだとコンストラクタの引数を変えれないので *(h+1) = new hoge(int ho); *(h+2) = new hoge(int ge); みたいにできないでしょうか
563 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 19:21:04.50 ] 別にコンストラクタを使わなあかんゆう決まりはないんやで
564 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 19:27:14.73 ] コンストラクタでなくても parent *h; h[0] = new child1(); h[1] = new child2(); みたいな使い方がしたいんです
565 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 19:29:43.99 ] いや、h[0].init(ho); やあかんのん? どうしても new したいのなら boost::ptr_vector<T> でも使っとき C++11 なら std::vector<std::unique_ptr<T>> でもええけど
566 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 19:33:32.17 ] >>562 std::vector<hoge> h; h.reserve(size); h.push_back(hoge(ho)); h.push_back(hoge(ge)); ...
567 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 19:36:28.00 ] >564 ttp://ideone.com/Q0B7n
568 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 19:53:32.36 ] >>565-567 ありがとうございます、試してみます
569 名前: ◆QZaw55cn4c mailto:sage [2012/06/02(土) 20:19:43.25 ] >>548 へーそうなんだ、なして?
570 名前:デフォルトの名無しさん [2012/06/02(土) 21:45:33.58 ] Java使いで、C++初心者です。 C++でも、 xxx.method(new A()); と書けると思うんですが、 この場合、Aのインスタンスのdeleteは、 どこですべきなのでしょうか? method内ですると、 A *a = new A(); xxx.method(a); のときにもdeleteされてしまい、その後使えなくなってしまいます。 C++では、 xxx.method(new A()); という使い方はよくないのでしょうか?
571 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 21:49:42.82 ] うん。良くない。unique_ptrとかshared_ptrを使うべき。
572 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 21:58:36.41 ] そもそもmethod側がnewすべきじゃね
573 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 22:19:09.09 ] っていうかぁー。 Javaはすべてのオブジェクトをnewで生成するけど、 C++はnewでオブジェクトと生成するのは 「スコープを私(プログラマ)が管理しますよ」って宣言するのとほとんど同義なのでー 生成した人が、破壊を管理しないといけないんですよー。 で、xxx.methodの中で破棄するなら、 それは生成と破棄をxxxが管理すべきですしー xxx.methodを呼び出す側が生成しているなら、破棄も呼び出す側の責任ですしー もしくは、A自身が己の破棄を自前で行うよう設計する必要があるわけですよー。 …タブンネ。
574 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 22:20:16.71 ] Decorator とか Builder とか Strategy とか
575 名前:570 mailto:sage [2012/06/02(土) 22:44:41.62 ] shared_ptrを使えば、deleteしなくていいみたいなので、 Java感覚でできるということですね。 >>571 さんありがとうございました。
576 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 23:01:03.29 ] Java感覚でプログラミングしたら C++使う意味ないね
577 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 23:16:06.28 ] 基本はconst参照か右辺値参照でどうにかする事を考えるみたいなのがC++極右
578 名前:デフォルトの名無しさん mailto:sage [2012/06/02(土) 23:20:47.09 ] うっへんち参照はライブラリ(コンテナ)設計者以外はあんまし考えなくていいみたいよ? ライブラリが正しく設計されていると、その利用者は右辺値参照について考慮しなくて済む。
579 名前:デフォルトの名無しさん mailto:sage [2012/06/03(日) 01:18:34.69 ] >>572 method関数がnewするなんてどこに書いてあった?
580 名前:デフォルトの名無しさん mailto:sage [2012/06/03(日) 08:22:12.26 ] C++は自動ガベージコレクションしてくれたりしないのでJavaみたいにnew/deleteを乱発してると そのうちメモリが断片化してbad_alloc例外飛ばされるぞ
581 名前:デフォルトの名無しさん mailto:sage [2012/06/03(日) 08:23:50.71 ] GCと断片化に何のつながりが
582 名前:デフォルトの名無しさん mailto:sage [2012/06/03(日) 08:25:37.74 ] コピーガベージコレクションならコンパクションかけられると言いたいんだろ
583 名前:デフォルトの名無しさん [2012/06/03(日) 08:44:04.41 ] g++でgprofの使い方がイマイチ分からん。 何かいいリファレンスかサイトある? 特にclassのメソッドをよく使っているプログラムで解析しやすい方法が知りたい。
584 名前:デフォルトの名無しさん mailto:sage [2012/06/03(日) 08:45:23.25 ] あとついでにインライン展開を止める方法も。
585 名前:デフォルトの名無しさん mailto:sage [2012/06/03(日) 09:42:01.37 ] >>584 ___attribute( 何か )___ で止められたはず 何かは、何だったか忘れた volatileだったかnoinlineだったかそんな感じだったはず
586 名前:デフォルトの名無しさん mailto:sage [2012/06/03(日) 12:51:55.87 ] GLSLシェーダやOpenCLカーネルのような実行時にコンパイルされるソースコードを main.cpp等のファイル内に簡単に埋め込む方法はないでしょうか。 現在はchar型配列に char data="int main(){..." 上のように書き込んでいますが見にくいので・・・(改行ごとにバックスラッシュを入れています) boostや標準機能の中でもっと綺麗に書く方法があればご教示お願いします。
587 名前:デフォルトの名無しさん mailto:sage [2012/06/03(日) 12:56:38.80 ] ある
588 名前:デフォルトの名無しさん mailto:sage [2012/06/03(日) 12:59:33.93 ] >>586 std::stringを返す専用の引数なし関数にキックするとか。
589 名前:デフォルトの名無しさん mailto:sage [2012/06/03(日) 13:00:14.86 ] >>586 エスケープ済みの別ファイルsource.cppとか 作ってmainで#include"source.cpp"じゃだめなんけ source.cppは、cl.cppみたいな別ファイルにソース書いといて 置換コマンドで、\,"を\\, \"に置き換えるだけ
590 名前:デフォルトの名無しさん mailto:sage [2012/06/03(日) 13:31:19.36 ] >>587 ,588,589 レスありがとうございます。 >>588 string型を返す専用関数で少しうまい方法を考えて見ます。 >>589 ヘッダのように別ファイルに書き込んで置換、というのは一度やってみたのですが 次の2点から少し敬遠していました。 ・IDE上に並ぶファイルが増える。 ・友人にコードを渡すときにヘッダが増殖する(lib化しろ、というのは最もなのですがWinとMac・・・) 588さんの書き込みを見ていろいろ探していたところ、 string tmp=STRINGIFY(int main(){...); のような書き方をしているコードを見かけたので中を調べてみます。 皆様すぐにレスしていただきありがとうございました。