■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part51
501 名前:デフォルトの名無しさん :2006/08/03(木) 03:59:31
>>500
FAQ だなぁ。
↓の 940- 見て。
http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
(http://pc5.2ch.net/test/read.cgi/tech/1052625846/940-)

502 名前:デフォルトの名無しさん :2006/08/03(木) 06:15:31
Windows によって iTraxx.exe でブレークポイントが発生しました。

ヒープが壊れていることが原因として考えられます。iTraxx.exe または読み込まれた DLL にバグがあります。


というエラーメッセージが出て困ってるのですが、何か心当たりはありませんか?
無視して継続すると、普通に処理ができます。

503 名前:502 :2006/08/03(木) 06:17:30
HEAP[iTraxx.exe]: HEAP: Free Heap block 41c928 modified at 41caa8 after it was freed
というのも書いてありました。

504 名前:502 :2006/08/03(木) 06:46:19
すいません、自己解決しました。

メモリを確保していない領域に書き込んでしまっていたようです。
初歩的な問題で場を濁してすみませんでした。

505 名前:500 :2006/08/03(木) 19:09:29
>>501
ありがとうございました
今後きちんとログを調べるようにします

506 名前:デフォルトの名無しさん :2006/08/03(木) 19:10:39
クラスのインスタンスをスタック上に作成することは許可しますが、
ヒープ上に作成することは禁止したい。このようなことは可能ですか?

507 名前:デフォルトの名無しさん :2006/08/03(木) 19:22:36
可能

508 名前:506 :2006/08/03(木) 20:36:09
どうやってですか?

509 名前:デフォルトの名無しさん :2006/08/03(木) 20:49:23
D&Eからだけど、こうするとグローバル変数とローカル変数しか作れなくなるそうだ。
class No_free_store {
    class Dummy { };
    void* operator new(size_t, Dummy);
    // ...
};

510 名前:506 :2006/08/03(木) 21:42:51
>>509
ありがとう。試してみる。m(_ _)m

511 名前:夜も眠れない :2006/08/05(土) 16:57:40
std::time_t がオーバーフローしそうです。

512 名前:デフォルトの名無しさん :2006/08/06(日) 01:08:14
>>511
32年後か?

513 名前:デフォルトの名無しさん :2006/08/06(日) 10:55:14
というかsizeof(std::time_t)は、
大きくなっている環境が増えてきているぜ?

514 名前:デフォルトの名無しさん :2006/08/06(日) 14:14:36
冷害が発生した箇所を特定するにはどうすればよいでしょう?
JavaやC#のように、スタックトレースの出力は行えないのでしょうか。

515 名前:514 :2006/08/06(日) 14:15:13
>>514
「例外」です。すみません...

516 名前:デフォルトの名無しさん :2006/08/06(日) 14:17:05
平均気温と作況指数を見る。

517 名前:516 :2006/08/06(日) 14:17:58
言葉が正しいかぐぐってる間に訂正された orz

518 名前:デフォルトの名無しさん :2006/08/06(日) 14:18:06
今年のホットなテーマは冷害より雨害だと思うがなぁ。

519 名前:デフォルトの名無しさん :2006/08/06(日) 14:33:24
冷害は常にクールな話題だぜ

520 名前:デフォルトの名無しさん :2006/08/06(日) 14:55:01
>>519
誰が美味い米を食えと言った

521 名前:デフォルトの名無しさん :2006/08/06(日) 15:14:51
>>514
自動的には行われない。自分で例外オブジェクトに __FILE__ とか __LINE__ とか
埋めれば、それっぽいことはできる。

522 名前:デフォルトの名無しさん :2006/08/06(日) 15:19:04
処理系によるだろ。

523 名前:デフォルトの名無しさん :2006/08/06(日) 15:21:01
>>522 何の話?

524 名前:デフォルトの名無しさん :2006/08/06(日) 15:23:38
>>514
マップファイルを出力しておけば、エラーダイアログに表示されるアドレスから、
どこで落ちたか特定できる。

525 名前:デフォルトの名無しさん :2006/08/06(日) 16:17:08
>>521
例外オブジェクトのコンストラクタに毎回渡すってことか?

526 名前:デフォルトの名無しさん :2006/08/06(日) 16:39:47
>>525
そうだよ。

527 名前:デフォルトの名無しさん :2006/08/06(日) 17:12:25
>>526
カナシス

528 名前:デフォルトの名無しさん :2006/08/06(日) 17:31:05
>>514
#ifdef NDEBUG
#define THROW throw
#else
#define THROW fprintf(stderr, "%s (%d)\n", __FILE__, __LINE__), throw
#endif

とかして、THROW を使えばいい。

529 名前:デフォルトの名無しさん :2006/08/06(日) 18:14:53
このスレの 299- あたりも参照すべし。

530 名前:524 :2006/08/06(日) 19:38:40
無視かよ・・・ orz

531 名前:デフォルトの名無しさん :2006/08/06(日) 19:43:18
>>530
落ちた場所じゃなくて例外がスローされた場所の話だからね。

532 名前:デフォルトの名無しさん :2006/08/06(日) 20:12:48
相談です。

Win2K, MSVC++6.0
以下のプログラムを実行すると
unknown software exception(0xc00000fd) が発生して落ちてしまいます。
どこに問題があるのか分かる方お願いします。

#include <fstream>
#include <iostream>

int main(int argc, char* argv[])
{
//test.txtは存在しています。内容に関わらずエラーが出ます。
    std::ifstream fin("test.txt", std::ios::in | std::ios::binary);
    if(!fin){
        return 0;
    }
    const int bufSize = 1024*1024;
    unsigned char buf[bufSize];
    while(!fin.eof()) {
        std::cout << "r:";
        int len = fin.read(reinterpret_cast<char*>(buf), bufSize).gcount();
        std::cout << len << std::endl;
    }
    return 0;
}


533 名前:デフォルトの名無しさん :2006/08/06(日) 20:17:48
>>532
スタックサイズ

534 名前:デフォルトの名無しさん :2006/08/06(日) 20:18:25
>>532
デバッガでステップ実行しろよ

535 名前:デフォルトの名無しさん :2006/08/06(日) 20:23:52
>>533
d。1MBは駄目でしたか。
スタックにバッファ取る場合は常識的にどれくらいまで可能可能なんでしょうか?
再帰などは無しとして100KBくらいでも大きすぎでしょうか?

536 名前:デフォルトの名無しさん :2006/08/06(日) 20:36:56
知るかよ。
VC++のデフォルトは1MBだと思ったが。

537 名前:デフォルトの名無しさん :2006/08/06(日) 20:37:43
>>535
C++ 処理系が満たすべき最低限の指標として、規格中に
> Size of an object [262 144].
というのがある。
移植性のためにも単一のオブジェクトサイズは
ここまでにしとくのがいいんじゃないかね?

スタックサイズという概念は規格には無いので、
実際のところは環境に合わせて考えないとだめだよ。

538 名前:デフォルトの名無しさん :2006/08/06(日) 20:48:29
>>537
ありがとうございます。
最大でも200KBくらいということですね。
Linux+GCCでも使うので一般的なアプリの環境で考えていました。

539 名前:デフォルトの名無しさん :2006/08/06(日) 20:50:00
ヒープに取れよ。newしろ。

540 名前:デフォルトの名無しさん :2006/08/06(日) 20:52:03
>>537
早速誤解しやがったな。
"Size of an object" とスタックに確保可能なサイズは関係ない。

541 名前:デフォルトの名無しさん :2006/08/06(日) 21:05:49
/Fオプションでスタックサイズを変更しろって。

542 名前:デフォルトの名無しさん :2006/08/06(日) 21:48:18
100KBを超える場合はnewしようと思います。
コンパイルオプションを変えるほどの処理では無いので。
バッファは64KBにしました。

543 名前:デフォルトの名無しさん :2006/08/06(日) 21:58:56
バッファ程度ならstaticにでもしてしまえばいいじゃん。

544 名前:デフォルトの名無しさん :2006/08/06(日) 22:01:30
>>543
「バッファ程度」という基準の意味がわからん。 static のほうが嫌だし。

545 名前:デフォルトの名無しさん :2006/08/06(日) 22:04:41
相手にすんなって。

546 名前:デフォルトの名無しさん :2006/08/06(日) 23:25:45
初めて自分の家のPCでC言語を使ってみようと思って、NET Framework SDK
をDLしてインストールしましたが、IIS(インターネントインフォメーションサービス)?が
コントロールパネルのコンポーネントと追加の削除の中からできるようにしておかないと
ダメみたいなので探しても見当たらない・・・。
これってもともとPCに入ってるものなの??

XPを使ってて他の方法も考えてますが誰かエロイ人教えてくれませんか??
お願いします><

547 名前:デフォルトの名無しさん :2006/08/06(日) 23:31:47
教えてやりたいが俺はエロくないので…残念だ

548 名前:デフォルトの名無しさん :2006/08/06(日) 23:33:30
他スレを見るまでもなくマルチと分かるこの香り

549 名前:デフォルトの名無しさん :2006/08/06(日) 23:35:11
君が本当に落とすべきだったのはこれ
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/

550 名前:546 :2006/08/06(日) 23:35:58
これマジですorz
マルチでもなんでもないんです!!(実はマルチの意味すら分かってない


551 名前:549 :2006/08/06(日) 23:39:01
なんだよーマルチかよー
相手して損した

552 名前:デフォルトの名無しさん :2006/08/06(日) 23:39:19
フーン

553 名前:546 :2006/08/06(日) 23:44:18
>>549
ありがとう〜今やってるとこだけど俺は違うのを落としてたのかな?
ちなみにマルチってどういう意味?

マルチ商法??

554 名前:デフォルトの名無しさん :2006/08/06(日) 23:46:34
>>553
複数のスレッドに同じ内容を書き込むこと。
それくらい自分で調べろよ。

555 名前:546 :2006/08/06(日) 23:48:34
大丈夫!ここにしか書き込んでないから^^
ありがとう〜初心者なのでこれから頑張っていきます!!

556 名前:546 :2006/08/07(月) 00:17:07
今やっと終わったけどIISって必要ないの?
その部分に関しては何も変わってないきががする・・・

557 名前:デフォルトの名無しさん :2006/08/07(月) 00:21:00
through

558 名前:546 :2006/08/07(月) 00:21:48
through?
意味わかんないんだけど・・・

559 名前:デフォルトの名無しさん :2006/08/07(月) 00:22:10
>>556
ドキュメント読んで一通りセットアップしてから、それでも問題が出たら VC スレに逝け。

560 名前:546 :2006/08/07(月) 00:25:03
これってウィンドウズプログラム作れないの?

561 名前:デフォルトの名無しさん :2006/08/07(月) 00:28:05
作れます。

562 名前:546 :2006/08/07(月) 00:51:30
>>560
出た!教えて訓!

563 名前:デフォルトの名無しさん :2006/08/07(月) 01:07:05
質問です。

class parents{...};
class child:public parents{...};

以上の親クラスと、親を継承する子クラスがあったとして

base *obj = new child;
delete obj;

このようにdeleteにポインタを渡す時点で型が変わってる時、
正常なdelete処理は行われますか?
なんとなくparents型のサイズしか開放されない気がするのですが・・・。
教えて欲しいです。

564 名前:デフォルトの名無しさん :2006/08/07(月) 01:08:58
555までで終わっておけば良かったのに
なんか損した気分

>>562
騙りレス番消し忘れてるぞ

565 名前:デフォルトの名無しさん :2006/08/07(月) 01:10:25
>>563
問題ない。deleteは型の認識はせずにサイズだけ記憶している。

566 名前:デフォルトの名無しさん :2006/08/07(月) 01:10:59
childのデストラクタにprintfでも仕込んで確かめりゃいいじゃん

567 名前:デフォルトの名無しさん :2006/08/07(月) 01:19:47
カソーデストラーデ

568 名前:563 :2006/08/07(月) 01:27:42
>>565さん
ありがとうございます。メモリ自体は正常に破棄されるんですね。

>>566さん
おっしゃるとおりです・・・ただデストラクタは呼ばれなかったけど
C言語のmallocとfreeなら正常に破棄してくれそうなので。

>>567さん
仮想デストラクタの機能は今知りました!
まさにこういうのを求めてたので・・・ありがとうございました!

569 名前:デフォルトの名無しさん :2006/08/07(月) 01:53:06
>>564
556までの間違いだろバカ!
なんか損した気分

570 名前:デフォルトの名無しさん :2006/08/07(月) 02:45:34
バカは君のことだよ

571 名前:デフォルトの名無しさん :2006/08/07(月) 03:07:16
バカばっかりだな

572 名前:デフォルトの名無しさん :2006/08/07(月) 04:08:50
メモ帳で次の文字を教科書どおりに入力し、デスクトップに保存しました
<HTML>
<HEAD>
<TITLE>Hello JavaScript</TITLE>
</HEAD>
<BODY>
<SCRIPT language="JavaScript">
document.write("Hello! JavaScript!!");
</SCRIPT>
</BODY>
</HTML>
IEで開こうとしてもなぜかHP調の画面にならず、そのまま文字が表示されるだけでした。これはなぜでしょうか?

すみませんマルチになってしまい申し訳ありませんが

573 名前:デフォルトの名無しさん :2006/08/07(月) 04:10:05
激しくスレ違い

574 名前:デフォルトの名無しさん :2006/08/07(月) 06:18:26
アニメから映画、ゲーム実況まで何でもある
みんなでvip実況スレを盛り上げよう

ニュー速VIP
ttp://ex16.2ch.net/news4vip/

FF4→5→6 リレー実況 ttp://ex16.2ch.net/test/read.cgi/news4vip/1154895492/
ゲームセンターCX ttp://ex16.2ch.net/test/read.cgi/news4vip/1154888213/
エロゲ実況 ttp://ex16.2ch.net/test/read.cgi/news4vip/1154839702/
おまいらが指定したゲーム実況 ttp://ex16.2ch.net/test/read.cgi/news4vip/1154896516/
RPG実況 ttp://ex16.2ch.net/test/read.cgi/news4vip/1154857556/
女神転生とかを実況  ttp://ex16.2ch.net/test/read.cgi/news4vip/1154776872/
実況!アニメ流すぜ!3本目 ttp://ex16.2ch.net/test/read.cgi/news4vip/1154877307/
【東方】弾幕実況 ttp://ex16.2ch.net/test/read.cgi/news4vip/1154852500/
ファミコンジャンプ実況スレ ttp://ex16.2ch.net/test/read.cgi/news4vip/1154878214/
エロゲ実況すればいいじゃねーか ttp://ex16.2ch.net/test/read.cgi/news4vip/1154885750/
大神実況してみる その4ttp://ex16.2ch.net/test/read.cgi/news4vip/1154880537/
ICO実況 ttp://ex16.2ch.net/test/read.cgi/news4vip/1154896258/
好きなゲームを実況するスレ ttp://ex16.2ch.net/test/read.cgi/news4vip/1154861584/
ToHeart2系実況ttp://ex16.2ch.net/test/read.cgi/news4vip/1154774247/
かまいたちの夜x3を実況してみるttp://ex16.2ch.net/test/read.cgi/news4vip/1154863755/
映画実況するのかも ttp://ex16.2ch.net/test/read.cgi/news4vip/1154895107/
FF4→5→6→7 リレー実況  ttp://ex16.2ch.net/test/read.cgi/news4vip/1154898127/

575 名前:デフォルトの名無しさん :2006/08/07(月) 13:16:20
int i;
(i = 3) && printf("%d",i);

これを一文で書きたくて

( int i = 3 ) && printf("%d",i);
としたらiが定義されていないとエラーになります
一文では書けないのでしょうか?

576 名前:デフォルトの名無しさん :2006/08/07(月) 13:59:52
無理。

577 名前:デフォルトの名無しさん :2006/08/07(月) 14:47:34
変数の宣言は式ではないから、式の中には書けない。

578 名前:デフォルトの名無しさん :2006/08/07(月) 15:01:11
gcc拡張に依存していいならブロック式が使える。

けどこれ結局、式文にして式の値使ってないから、
普通のブロックでも代りないのでは?

{ int i = 3; i && printf("%d",i); }

579 名前:デフォルトの名無しさん :2006/08/07(月) 15:06:54
>>578
それどこらへんがgcc拡張?

580 名前:デフォルトの名無しさん :2006/08/07(月) 15:21:16
gcc拡張の例は必要なさそうなので書かなかった。

↓使いたい人はこちらをご覧あれ
http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Statement-Exprs.html#Statement-Exprs

581 名前:デフォルトの名無しさん :2006/08/07(月) 16:52:13
Perl だとできるんだよね。

my ($n) = /^(hoge)/ or die()

まぁ、そもそも宣言しなくて変数使えるんだけど。

582 名前:デフォルトの名無しさん :2006/08/07(月) 16:58:21
それがどうした。

583 名前:デフォルトの名無しさん :2006/08/07(月) 18:06:12
アプリ上からchmファイルを呼ぶためには
どのような記述をすればよいのでしょうか。
VC6.0です。

584 名前:呼んでみた :2006/08/07(月) 18:24:58
おーい、chmファイルやーい。

585 名前:デフォルトの名無しさん :2006/08/07(月) 18:30:25
Perl だとできるんだよね。

ohi $file.chm or die()

まぁ、そもそも呼ばなくてもchmファイルやってくるんだけど。

586 名前:デフォルトの名無しさん :2006/08/07(月) 18:40:50
だからそれがどうした。スレ違いもいい所だ。

587 名前:デフォルトの名無しさん :2006/08/07(月) 19:04:19
>>586
まぁまぁ。せっかく夏休みにPerl覚えたばっかりだから
ひけらかしたいんだろう。

588 名前:デフォルトの名無しさん :2006/08/07(月) 19:19:21
>>585
そんなわけあるかw
だが、perlだとあっても不思議ではない気がするのが怖い。

589 名前:デフォルトの名無しさん :2006/08/07(月) 19:36:23
>>575
int i = (((i = 3) && printf("%d", i)), i);

これで出来ないことはないが、こんなコードは採用するな。

590 名前:デフォルトの名無しさん :2006/08/07(月) 19:44:59
>>589
それじゃ意味がちがくない?
というか、元々の文の意味も、何がやりたいのかよー分からんのだがな・・・。
i = 3 は常に真だから、

int i = 3;
printf("%d", i);

でいいじゃん。

591 名前:デフォルトの名無しさん :2006/08/07(月) 19:51:39
>>589
>それじゃ意味がちがくない?

どのへんが?

>i = 3 は常に真だから、

わざわざ判定してるぐらいだからサンプルとして"3"を代入してるだけで
変わる可能性があるんじゃないのか?

592 名前:デフォルトの名無しさん :2006/08/07(月) 20:24:55
プログラム初心者ですが、質問です。

例えば、プログラムA、プログラムBという、
VC++6.0できちんと動作する別々のプログラムがあったとして、
プログラムA上でプログラムBを呼び出し、(コマンドボタンなどで)
別窓で動かすにはどうしたら良いでしょうか。



593 名前:デフォルトの名無しさん :2006/08/07(月) 20:37:19
無理

594 名前:デフォルトの名無しさん :2006/08/07(月) 20:39:24
そもそもC++の規格にコマンドボタンというものは(ry

595 名前:デフォルトの名無しさん :2006/08/07(月) 20:41:53
VC++6.0ということはWindows環境だと思うが、
Windowsの仕様にもコマンドボタンというものは(ry

596 名前:デフォルトの名無しさん :2006/08/07(月) 21:57:08
>>590
想像力が欠如してるな

597 名前:デフォルトの名無しさん :2006/08/07(月) 22:42:10
VC8 on WindowsXPです。(環境依存の質問は良いでしょうか?)

std::bad_alloc例外を投げてもワトソンがログ吐いてくれないのですが、
後でクラッシュした箇所を知ろうとしたときどうすればいいでしょうか。

クラッシュした直後であればクラッシュ報告ダイアログ上で情報が見られるようですが、
この情報はどこかに保存されていたりするのでしょうか…


598 名前:デフォルトの名無しさん :2006/08/07(月) 22:50:52
>>591
>>それじゃ意味がちがくない?
>どのへんが?
i の値が保存されない

599 名前:デフォルトの名無しさん :2006/08/07(月) 22:51:30
と思ったら、, i が最後に付いてたのね。
問題ないわ。スマソ。

600 名前:デフォルトの名無しさん :2006/08/07(月) 22:54:21
int i = (((i = 3) && printf("%d", i)), i);
を実行すると
iの値は3

601 名前:デフォルトの名無しさん :2006/08/07(月) 22:55:08
自己解決してやがるOTL

602 名前:デフォルトの名無しさん :2006/08/07(月) 22:58:43
C++スレなんだからこれでいいじゃん
if(int i = 3) printf("%d",i); 

603 名前:デフォルトの名無しさん :2006/08/07(月) 23:01:40
>>602
i のスコープがどーなるか知ってて言ってんのか?

604 名前:デフォルトの名無しさん :2006/08/07(月) 23:03:55
VC6だったらどうなるんだろうな?w

605 名前:デフォルトの名無しさん :2006/08/07(月) 23:05:14
>>603
言ってますよ。

606 名前:デフォルトの名無しさん :2006/08/07(月) 23:13:18
>>601
すまんかった。
printf の ,i もあるから、それと勘違いしてたのね。

607 名前:デフォルトの名無しさん :2006/08/07(月) 23:18:16
>>603
i のスコープはprintf()まで有効なんじゃねーの?
(if 文抜けたら無効)

608 名前:デフォルトの名無しさん :2006/08/07(月) 23:20:01
>>603
おっと、だからイクナイのか、スマソ

609 名前:デフォルトの名無しさん :2006/08/07(月) 23:34:51
>>600
どうやらそうとも言い切れないようだ。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#504

610 名前:デフォルトの名無しさん :2006/08/07(月) 23:52:19
>>609
英語ヨメネ
コンパイラ依存?


611 名前:デフォルトの名無しさん :2006/08/08(火) 00:16:00
>>610
禿とその仲間たちが int i = i; なんてエラーにしたほうがいいんだろうな、とか言ってる。

612 名前:デフォルトの名無しさん :2006/08/08(火) 00:27:17
>>611
禿とその仲間たち→禿と愉快な仲間たち


613 名前:デフォルトの名無しさん :2006/08/08(火) 00:28:41
>>611
禿げの言うことならほっとくか

614 名前:デフォルトの名無しさん :2006/08/08(火) 00:44:22
>>611
そのくせ void *p = &p; はおk、とか言ってるあたりがなんだかなぁもうって感じ。
確かにそうしたほうが非常に C++ っぽいとは思うが。

615 名前:デフォルトの名無しさん :2006/08/08(火) 00:49:20
>>614
はぁ?それはOKに決まってるだろ。馬鹿ですぅかぁ?

616 名前:デフォルトの名無しさん :2006/08/08(火) 00:51:50
int i = i;
はiにどんな値が入るか完全に不定だが、

void *p = &p;
はpにpへのポインタが入る。

なんだかなぁもうって言ってる人がなんだかなぁって感じ。
何にも分かってないんだね。

617 名前:デフォルトの名無しさん :2006/08/08(火) 00:53:04
アホにつくレスだけは早いのなw

618 名前:デフォルトの名無しさん :2006/08/08(火) 00:55:31
>>616
そんなことはわかった上で言ってるんだが。

619 名前:デフォルトの名無しさん :2006/08/08(火) 00:55:51
脊髄のほうが早い。人間だもの。

620 名前:デフォルトの名無しさん :2006/08/08(火) 01:07:45
>>618
ハイハイw 俺もお前が馬鹿と分かった上で言ってるよw

621 名前:デフォルトの名無しさん :2006/08/08(火) 01:35:33
>>616
pへのポインタっつうことはポインタへのポインタってことなんすよね?
何か左辺と右辺で型が違うような気がする
分からんようになってきてもうた

622 名前:デフォルトの名無しさん :2006/08/08(火) 01:43:51
>>621
void型のポインタだから合法

623 名前:デフォルトの名無しさん :2006/08/08(火) 01:45:06
void * だから何でも入るだろ。

まあ、void *p = &p; なんてすることに
どれだけの意味があるのか知らんが。

624 名前:デフォルトの名無しさん :2006/08/08(火) 08:50:00
#include <ctime> してるんですが、
time_t や time() がグローバルな名前空間に見えています。
std::time_t や std::time() じゃないと気持ち悪いのですが、
何とかなりませんでしょうか?

ちなみに開発環境は Visual Studio 2005 Professional です。

625 名前:デフォルトの名無しさん :2006/08/08(火) 10:36:47
std::string を関数の戻り値として使うときなどは、
中で激しくコピーが起こりまくっているんでしょうか?
リファレンスカウントにするとか、copy-on-write に
するとかは実装者依存なんですか?

626 名前:デフォルトの名無しさん :2006/08/08(火) 10:48:57
>>625
RVOが働けば最低限のコピーでう済むだろうなあ。
リファレンスカウントとかは実装依存。

627 名前:デフォルトの名無しさん :2006/08/08(火) 10:54:38
ふむぅ、RVOが働くかどうかも処理系依存だしなぁ。

std::wstring o(L"おなにぃ")
//処理
return o;

とかはやっぱやるべきじゃないんだろうか。
戻り値じゃなく参照な引数で返すべきなんだろうか。

628 名前:デフォルトの名無しさん :2006/08/08(火) 10:55:36
ほかの参照ベースのオブジェクト処理言語系みたく
扱おうと思ったら、なんでもかんでも boost::shared_ptr ?

629 名前:デフォルトの名無しさん :2006/08/08(火) 11:12:22
>>624
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#456

630 名前:デフォルトの名無しさん :2006/08/08(火) 11:18:28
>>628
Boehm GCとかもある。shared_ptrなんかだと循環参照とか気にする必要がある。

631 名前:デフォルトの名無しさん :2006/08/08(火) 12:43:25
>>625
参照返すんじゃまずいのか?

632 名前:デフォルトの名無しさん :2006/08/08(火) 12:45:20
>>631 寿命の問題が発生するのが嫌なんだろう。

633 名前:デフォルトの名無しさん :2006/08/08(火) 12:56:49
嫌つーか、自動変数の参照返したらまずいだろ。

634 名前:デフォルトの名無しさん :2006/08/08(火) 13:03:16
RVOって例えば以下で
コピーコンストラクタが呼ばれなければ
効いているって考えていいんでしょうか?

#include <iostream>
using namespace std;
struct A {
A () {}
A (const A &p) {cout << "hoge" << endl;}
};
A func () {return A ();}
int main () {
A a (func ());
return 0;
}


635 名前:デフォルトの名無しさん :2006/08/08(火) 13:13:15
>>634
それだと func() の戻り値と a の生成で2回コピーコンストラクタが使われる可能性がある。

636 名前:デフォルトの名無しさん :2006/08/08(火) 13:21:25
>>635
なるほど
hogeが表示される回数は0ないし1ないし2の可能性があって
何回呼ばれるかは規格では定まってないと.
勉強になりました.


637 名前:592 :2006/08/08(火) 14:41:47
お答えくださったのに、何も言わずにすみませんでした。
お答えくださった方々、ありがとうございました。
スレが違っていたみたいです、申し訳ありません。

失礼しました。

638 名前:デフォルトの名無しさん :2006/08/08(火) 15:36:41
>>633
>>625に自動変数なんて制約はないよ。

639 名前:デフォルトの名無しさん :2006/08/08(火) 18:06:17
クラスを定義すると無条件で(デフォルトで)
1)デフォルトコンストラクタ
2)コピーコンストラクタ
3)代入演算子
が生成されますか?


640 名前:639 :2006/08/08(火) 18:13:03
何かコンストラクタを定義するとデフォルトコンストラクタは
自動定義されなくなりますが、コピーコンストラクタと代入演算子は
あいかわらず自動で定義されたものがそのまま存在するのですね。
勝手に使われているのが不安な場合は両者を protected などに
しておくというのが常套手段なんですか?

641 名前:デフォルトの名無しさん :2006/08/08(火) 18:41:14
そんなあなるにboost::noncopyable

642 名前:デフォルトの名無しさん :2006/08/08(火) 19:04:37
もう、boost禁止で。

643 名前:あなる :2006/08/08(火) 20:22:37
>>641 ありがとう
>>642 それじゃプログラム組めないよ・・・もはや


644 名前:デフォルトの名無しさん :2006/08/08(火) 21:24:22
>>640
代入演算子とコピーコンストラクタを、privateで宣言するのが常套手段。定義の必要はない。

何が何でもboost使いたければ、お好きなように。

645 名前:デフォルトの名無しさん :2006/08/08(火) 21:34:39
ビットマスクって1と2が設定されているのと3が設定されているのはどうやって見分けるの?

646 名前:デフォルトの名無しさん :2006/08/08(火) 21:37:17
>>645
日本語でおk

647 名前:デフォルトの名無しさん :2006/08/08(火) 22:00:05
>>645
どうやって見分けるかは完璧に君の自由だ羨ましいぜこのやろう

648 名前:デフォルトの名無しさん :2006/08/08(火) 22:55:34
フラグの定数に3なんて使わないだろ

649 名前:デフォルトの名無しさん :2006/08/08(火) 23:10:17
ブラク?部落?

650 名前:デフォルトの名無しさん :2006/08/08(火) 23:40:22
1
2
4
8
16
32
64
128
256
512

651 名前:デフォルトの名無しさん :2006/08/08(火) 23:43:50
1 & 2 のエイリアスとして3が定義されてるとか

652 名前:デフォルトの名無しさん :2006/08/08(火) 23:53:25
1 | 2 じゃね?

653 名前:デフォルトの名無しさん :2006/08/09(水) 00:02:15
STLのmapに抽象クラスって入りますか?
実際には、抽象クラスを継承したものを入れたいんですが。

654 名前:デフォルトの名無しさん :2006/08/09(水) 00:05:54
>>653 抽象クラスのポインタを入れればいい。

655 名前:デフォルトの名無しさん :2006/08/09(水) 00:08:12
>>654
なるほど。盲点でした。
ありがとうございました。

656 名前:デフォルトの名無しさん :2006/08/09(水) 00:35:09
>>640
君、Effective C++読まないと!

657 名前:デフォルトの名無しさん :2006/08/09(水) 10:00:47
ここって初心者スレだったの?

658 名前:デフォルトの名無しさん :2006/08/09(水) 10:08:08
高度な話題になると荒れるから初心者でいんじゃね・・・。

659 名前:デフォルトの名無しさん :2006/08/09(水) 12:31:15
>>638
遅レスでどうでもいいツッコミだが
「参照返す」って言われたら中で自動変数作って参照の戻り値を返す以外に
なんかあるか?

660 名前:デフォルトの名無しさん :2006/08/09(水) 12:44:07
ある

661 名前:デフォルトの名無しさん :2006/08/09(水) 12:45:06
T& foo() {
return *(new T);
}

662 名前:デフォルトの名無しさん :2006/08/09(水) 12:54:55
勘弁してくれ

663 名前:デフォルトの名無しさん :2006/08/09(水) 12:57:34
>>661 かっこいい!

664 名前:デフォルトの名無しさん :2006/08/09(水) 13:13:43
std::string& foo() {
std::string *p = new std::string;
ああだこうだ;
return *p;
}

普通にやる


665 名前:デフォルトの名無しさん :2006/08/09(水) 13:24:23
その std::string のインスタンス、
ちゃんと責任もって delete してやれよ・・・

666 名前:デフォルトの名無しさん :2006/08/09(水) 13:52:14
Effective C++によれば、
>>665の意味でわけわからなくなるから、やらないこと推奨の方法。

667 名前:デフォルトの名無しさん :2006/08/09(水) 13:57:19
string &a=foo();
のとき、
delete &a;
ってなるのか?
すごく気持ち悪いけど、よく使うやり方なのかな。
俺がもしどうしてもこういう場面になったらshared_ptr使うとおもうけど。


668 名前:デフォルトの名無しさん :2006/08/09(水) 14:10:10
それ以前にあらかじめ引数でfooにstringくれてやれよ。

669 名前:デフォルトの名無しさん :2006/08/09(水) 14:43:52
>>668
参照を返すときの話をしてるんだけど

670 名前:デフォルトの名無しさん :2006/08/09(水) 16:19:34
そんなあなるにmove_ptr

671 名前:デフォルトの名無しさん :2006/08/09(水) 16:24:20
コンストラクタに与えるタグで振る舞いを変えたくて以下のようにしてみました。
ただ、継承しつつ内部に包含する(?)というのがある程度一般的になされることなのか
自信がありません。コメント頂けるとありがたいです。

struct base { virtual void func(void) = 0; }; // インターフェイス
struct derived1 : public base { void func(void) { cout << "d1" << endl;} };
struct derived2 : public base { void func(void) { cout << "d2" << endl;} };

struct t1 {}; // 切り替え用の
struct t2 {}; // タグ

struct X : public base {
X(t1) : m_impl(new derived1) {} // t1指定でderived1の動作
X(t2) : m_impl(new derived2) {} // t2指定でderived2の動作
~X() { delete m_impl; }
void func(void) { m_impl->func(); }
base* m_impl;
};

int main(void) {
t2 t; // t2を
X x(t); // 指定したので
x.func(); // d2と表示
return 0;
}


672 名前:デフォルトの名無しさん :2006/08/09(水) 16:32:25
べつにふつーとおもた

673 名前:671 :2006/08/09(水) 17:22:07
>>672
ふつーですか。
「インターフェイスの継承+包含による実装の委譲」と理解しました。
継承と委譲の関係を混同していたので気持ち悪く感じてしまったようです。
どうも〜。


674 名前:デフォルトの名無しさん :2006/08/09(水) 17:55:51
>>673
デザインパターンのストラテジーパターンなどの説明を読むとすっきりするかもね。

675 名前:デフォルトの名無しさん :2006/08/09(水) 18:15:39
tyr4w@hort5rs,
9yq@t@0w@deleteduese:joyw@rt?

676 名前:デフォルトの名無しさん :2006/08/09(水) 18:17:53
structには、誰も突っ込まんのか

677 名前:デフォルトの名無しさん :2006/08/09(水) 18:46:38
>>676
?

678 名前:デフォルトの名無しさん :2006/08/09(水) 18:48:18
>>677
??

679 名前:デフォルトの名無しさん :2006/08/09(水) 18:58:46
>>676
structだと何がまずいの?

680 名前:デフォルトの名無しさん :2006/08/09(水) 19:02:34
>>679
別にまずくないんじゃないの

681 名前:デフォルトの名無しさん :2006/08/09(水) 19:06:02
>>680
なんでまずくないんじゃないの?

682 名前:デフォルトの名無しさん :2006/08/09(水) 19:08:52
671でstructを使ったのはpublic:をけちって行数削減するためだろうと思ったが違うのか?

683 名前:デフォルトの名無しさん :2006/08/09(水) 19:19:26
>>682
さあ?普段からstruct使う人かもよ?

684 名前:671 :2006/08/09(水) 19:30:58
変なところを指摘されてる…。
structもclassも同じだと思ってましたがまずいですか?
structとした理由に>>682以上の意味はありませんが。


685 名前:デフォルトの名無しさん :2006/08/09(水) 19:39:30
イッヨ 2chクオリティ

686 名前:デフォルトの名無しさん :2006/08/09(水) 19:40:27
>>684
>>671の内容だったら、classにしてもたかだか1行しか変わらないと思うけど。

687 名前:デフォルトの名無しさん :2006/08/09(水) 19:57:04
>>686
本質とは関係ないものを排除して、見やすくしてるんだよ。

688 名前:デフォルトの名無しさん :2006/08/09(水) 22:47:36
その結果、本質とは関係ない疑問もわいたりするがな

689 名前:デフォルトの名無しさん :2006/08/10(木) 00:11:46
無知な奴にしかわかないよ

690 名前:デフォルトの名無しさん :2006/08/10(木) 00:20:33
>>671
コンストラクタの部分特殊化ができれば、
インスタンス作らないでもできるのにね。

691 名前:デフォルトの名無しさん :2006/08/10(木) 00:23:52
>>676
同じような用途のiterator_categoryも、
ほとんどの場合struct使って書いてあるよ。
規格書からしてそうだから。
24.2 Header <iterator> synoposis

692 名前:デフォルトの名無しさん :2006/08/10(木) 00:24:52
出た、規格書厨

693 名前:デフォルトの名無しさん :2006/08/10(木) 00:26:18
>>691 関係ない。

694 名前:デフォルトの名無しさん :2006/08/10(木) 01:11:19
structかclassか、typenameかclassかに突っ込む奴は素人

695 名前:デフォルトの名無しさん :2006/08/10(木) 03:27:40
>>694
それは視点がずれてるとオモ。

696 名前:デフォルトの名無しさん :2006/08/10(木) 14:55:49
指定したフォルダ(ディレクトリ)以下のファイル名を取得したいのですが、
自分なりに調べたところ、VisualC++に依存したものしか見つかりませんでした。

出来ればWindowsでもUNIXでも使えるコードを書きたいのでVisualC++に依存した
物は作りたくありません。
STLやboostなどの(準)標準的なライブラリを使ってこういう事は実現出来ますか?

697 名前:デフォルトの名無しさん :2006/08/10(木) 14:57:28
boost::filesystemでぐぐれ

698 名前:デフォルトの名無しさん :2006/08/10(木) 14:59:17
boost馬鹿は新でいいよ。

699 名前:デフォルトの名無しさん :2006/08/10(木) 15:18:34
new boost::馬鹿;

700 名前:デフォルトの名無しさん :2006/08/10(木) 15:21:54
>>696
マジレスすると、ファイルシステムはOSによって異なるから、ディレクトリ操作は異なるAPIを使わざるを得ない。
それがいやなら、処理系依存部分をラップしてくれるライブラリを探してきて使う。

701 名前:デフォルトの名無しさん :2006/08/10(木) 15:22:27
boost::馬鹿::Create信者("http://www.google.co.jp/");

702 名前:デフォルトの名無しさん :2006/08/10(木) 15:30:44
>>697, >>700
ありがとうございました。他にライブラリ探すのも面倒なんで、おとなしくboost使ってみます。

ところで、なぜboostはこんなに嫌われてるんですか?(>>698, >>699, >>701)

703 名前:デフォルトの名無しさん :2006/08/10(木) 15:59:28
boost理解できなくて不貞腐れてるんだろ。

704 名前:デフォルトの名無しさん :2006/08/10(木) 16:04:33
そうだね、boostは難しいもんね

705 名前:デフォルトの名無しさん :2006/08/10(木) 16:07:59
>>702
どうやらboostが大嫌いな人が1人このスレに粘着してるみたい
無視していいよ

706 名前:デフォルトの名無しさん :2006/08/10(木) 16:15:07
boost使わないまっとうなやり方を勧めないで、いきなりboost勧めるから嫌われる

707 名前:デフォルトの名無しさん :2006/08/10(木) 16:15:14
使うだけなら簡単で便利だけど
理解しようとした途端に投げたくなるよね

708 名前:デフォルトの名無しさん :2006/08/10(木) 16:22:19
こうやってboost無しではディレクトリエントリを読むこともできない
糞プログラマが誕生したのであった。

709 名前:デフォルトの名無しさん :2006/08/10(木) 16:26:36
めでたしめでたし

710 名前:デフォルトの名無しさん :2006/08/10(木) 16:50:46
>>706
まっとうなやり方って、autoconf使って場合わけとか?


711 名前:デフォルトの名無しさん :2006/08/10(木) 16:52:09
>WindowsでもUNIXでも使えるコード
これをするには、boostに限らずとも、
なんらかのクロスプラットフォームなラッパを使うしかないのだがな。

//! それとも、WindowsとUNIX両方のやり方を覚えてみる?

712 名前:デフォルトの名無しさん :2006/08/10(木) 17:10:21
boost馬鹿馬鹿には何を言っても無駄。
ちまちま糞ラッパー書かせとけばいいんだよ。

713 名前:デフォルトの名無しさん :2006/08/10(木) 17:37:15
boostって良いライブラリと思うけどね
ところでどこが嫌いなの?


714 名前:デフォルトの名無しさん :2006/08/10(木) 19:05:45
>>711
普通の人は、WindowsとUnixの両方のやり方を覚えるけど、それが何か?

715 名前:デフォルトの名無しさん :2006/08/10(木) 19:30:15
とりあえずここは環境依存の話をしてよいスレではないはずだから、
WindowsとかUnix固有のやり方を答えるのは気が引ける。

逆に言えばそういう環境依存の答えを求めるなら、初心者歓迎のC/C++室で聞いてほしい。

716 名前:デフォルトの名無しさん :2006/08/10(木) 19:32:59
ライブラリ依存の答えはOKなんだ。

717 名前:デフォルトの名無しさん :2006/08/10(木) 19:38:29
Turbo C++復活だそうですね。

718 名前:デフォルトの名無しさん :2006/08/10(木) 19:44:36
仕事でboostを使えない環境でやらなければならない可能性がある奴を除けば、
boostでいいだろ。
ただまぁ、Win32APIやUnixのシステムコールの使い方くらいは知っといても損はない。

719 名前:デフォルトの名無しさん :2006/08/10(木) 19:50:45
>>713
仕事で使って好いときとイカンときがあること。

楽だから禁止のプロジェクトだと泣ける

720 名前:デフォルトの名無しさん :2006/08/10(木) 20:14:23
>>719
それじゃboostのことは大好きなんじゃない?
嫌うべきは禁止するプロジェクトだよ


721 名前:デフォルトの名無しさん :2006/08/10(木) 20:20:22
boost禁止されてる理由を言っていい範囲で教えてくれたらうれしい。



722 名前:デフォルトの名無しさん :2006/08/10(木) 20:50:03
>>721
ソース納品の時の顧客の要望 orz
チームのレベル全体を見た時の上司の決定 orz

それだけに使えるときのありがたさときたら。


723 名前:デフォルトの名無しさん :2006/08/10(木) 21:00:44
>>714が責任を持って>>696にboostを使わない方法を教えてくれるそうです

724 名前:デフォルトの名無しさん :2006/08/10(木) 21:16:44
>>721
保障されていない外部ライブラリの使用を禁止される場合なんてざらだよ。
多分、反論したいと思うだろうけど、そういう場合が多いのが現実。

725 名前:デフォルトの名無しさん :2006/08/11(金) 00:50:29
どうしてもそのまんまのソースでlコンパイル通したいなら
boostだろうけど、普通はラッパ書くよなぁ。

726 名前:デフォルトの名無しさん :2006/08/11(金) 00:55:56
「普通は」

特に根拠は示せないけど、自分の意見を通したい馬鹿が使う言葉

類似語 「一般的には」「常識では」「みんなもってるもん!」

727 名前:デフォルトの名無しさん :2006/08/11(金) 00:58:44
「馬鹿」

社会不適合奢が好んで使う言葉。

728 名前:デフォルトの名無しさん :2006/08/11(金) 01:00:24
>>727
「馬鹿」

自分が馬鹿な奴が使う言葉。賢い奴は他人に馬鹿と言わない。

729 名前:デフォルトの名無しさん :2006/08/11(金) 01:04:52
>728はまず日本語をしっかり勉強しよう!

730 名前:デフォルトの名無しさん :2006/08/11(金) 01:08:14
>>729
お、図星だったみたいだな。

731 名前:デフォルトの名無しさん :2006/08/11(金) 01:08:19
「社会不適合奢」

真の社会不適合奢が好んで使う言葉


732 名前:デフォルトの名無しさん :2006/08/11(金) 01:12:24
>>730
本当に馬鹿だなぁお前。

728の何が図星当ててるレスだっていうのやら。
さっさと日本語勉強してこい。


733 名前:デフォルトの名無しさん :2006/08/11(金) 01:33:08
残念。このレスを見た人は即死。

734 名前:デフォルトの名無しさん :2006/08/11(金) 01:53:42
>>732
余程くやしいようですね( ´,_ゝ`)

735 名前:デフォルトの名無しさん :2006/08/11(金) 02:06:09
そうだねw

736 名前:デフォルトの名無しさん :2006/08/11(金) 03:50:25
お前ら「ラッパ」の使い方間違ってるぞ

737 名前:デフォルトの名無しさん :2006/08/11(金) 04:48:15
露西亜を征服する意をこめて名付けられたんだそうな

738 名前:デフォルトの名無しさん :2006/08/11(金) 04:48:17
組み込みとかの話を言い出すときりがないので
それは置いといて、普段は仕事でも boost 使っているけど、
実行時型情報が使えない事情のあるプロジェクトで
boost 禁止ってのがあった。

boots の中でも使ってもいいライブラリとそうでないモノを
分離すれば良かったんだろうけど、とりあえず面倒なので
boost 禁止、と。

739 名前:デフォルトの名無しさん :2006/08/11(金) 10:47:45
仕事ではよくあることだな、何の制約もないプロジェクトの方が珍しい
STLでさえ禁止だったり、C++なのに一時変数は関数の先頭に必ず宣言をまとめろ、みたいな
規約(というか慣習)があるプロジェクトも多い品

740 名前:デフォルトの名無しさん :2006/08/11(金) 10:51:48
>C++なのに一時変数は関数の先頭に必ず宣言をまとめろ
これは普通だろ。

741 名前:デフォルトの名無しさん :2006/08/11(金) 10:54:52
朝から釣りはいいよ暑苦しい

742 名前:デフォルトの名無しさん :2006/08/11(金) 11:22:55
for_eachにテンプレート関数を渡したいのですがどうやればいいでしょうか。
以下のコードだと実体が無いのか未解決の外部シンボルを参照したとリンカに怒られました。

template <typename T>
void NotOp(T& c) { c = ~c; }

std::for_each(buf, bufend, NotOp<unsigned int>);

743 名前:デフォルトの名無しさん :2006/08/11(金) 11:46:51
>>742 VC6?

744 名前:デフォルトの名無しさん :2006/08/11(金) 12:00:03
>>743
VC7.0(.NET 2002)です。

745 名前:デフォルトの名無しさん :2006/08/11(金) 12:03:40
>>744
じゃ、たぶんバグだな。明示的インスタンス化を置いとけば一応動くはず。
こうだっけ?
template void NotOp(unsigned int&);

まぁバージョンアップをお勧めする。

746 名前:デフォルトの名無しさん :2006/08/11(金) 12:09:32
いや、普通に通るけど?

747 名前:デフォルトの名無しさん :2006/08/11(金) 12:11:42
>>746
バグって無いコンパイラなら普通に通るよ。
それとも VC7.0 でテストしてるってこと?

748 名前:デフォルトの名無しさん :2006/08/11(金) 12:13:33
そういうこと。もっともbufとbufendの定義が書いてないから絶対とはいえんけど。

749 名前:デフォルトの名無しさん :2006/08/11(金) 12:15:38
>>742
なんかあやしいから、コンパイルできて問題が再現する最小のコードと
エラーメッセージのコピペを貼ってほしい。

750 名前:742 :2006/08/11(金) 12:17:45
今新しいプロジェクトを作ってみます。


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.