1 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:53:59 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part61 pc11.2ch.net/test/read.cgi/tech/1205059063/
577 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:12:46 ] >>574 単にスワップメモリで足りただけじゃね?
578 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:24:19 ] >>576 典型的にはいらないページをスワップアウトしにいく >>577 確保だけならスワップは発生せずに即終了する
579 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:35:06 ] 「スワップに充分な領域が必要」な環境もあるし 「スワップに余裕があるか判断しない」環境もある。 後者だと、アクセスした途端にシステム全体でのメモリが不足することになる。 www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html >>578 の世界はLinuxだけで出来ている模様。 あと、どうしても失敗したければ new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが この2を2Lにしないとオーバーフローする環境もあるし 逆にlong引数のnewを認めない環境もあるんだろうな。
580 名前:デフォルトの名無しさん [2008/07/02(水) 01:31:51 ] > new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが だから、何でそうなる
581 名前:578 mailto:sage [2008/07/02(水) 01:42:20 ] >>579 ん? なんで自分がバカにされているのか全然理解できないんだけど いろいろな環境があることを頭に置いているからこそ578では 「典型的には」と頭につけたんだけどな あとそのコード変だよ 少なくともビットシフトされる方は 2 じゃなくて 1 じゃないとおかしいし そういうことやりたいなら new char[std::numeric_limits<size_t>::max()] で十分じゃないかな # ちなみにこういう最大限のメモリ確保は常識的な環境ならば1回ですぐに失敗するはず # なぜなら、普通はスタックのためのアドレス空間やカーネルアドレス空間が同居しているから
582 名前:デフォルトの名無しさん [2008/07/02(水) 12:26:21 ] > new char[std::numeric_limits<size_t>::max()] で十分じゃないかな やっと出てきたw が途中UNIXが出てきたり、やっと出てきたこれもmay beな言い方なので合格点はやれんな
583 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 12:35:24 ] std::size_t
584 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 12:36:06 ] SIZE_MAX
585 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 16:03:07 ] VC++のスレから来ました。相談させてください。 以下の710の質問をしました。 711の回答をもらいました。 それはそうだ、と納得しました。 --- 710 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:02:13 templateの使い方を教えてください class parent; class child : parent; の2つのクラスがあって、 void hogeFunc(vector<shared_ptr<parent> > & param) を呼び出したいとき、 vector<shared_ptr<parent> > vp; は渡せるけど、 vector<shared_ptr<child> > vc; が渡せないのはなんでかわからないです。 お分かりの方、理由を教えていただけないですか。 ちゃんと、pとcは親子関係にあるので問題ないと思っています。 711 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:07:53 vector<shared_ptr<child> >& から vector<shared_ptr<parent> >& に変換できないから。 --- で、解決方法について相談させてください。以下は正しいですか? ・ void hogeFunc(vector<shared_ptr<parent> > & param) のように、多態をvectorでやろうとしてるのが根本的に間違っている。 間違っているならこういったコンテナの要素を多態で扱いたいときは、 どのようにコーディングされているのか教えてください。
586 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 16:27:04 ] template<typename T> void hogeFunc(vector<shared_ptr<T> > & param){ struct check{ void f(){ T* a=NULL; parent* b = a; } }; ... }
587 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:29:52 ] 樹木型(IPアドレスのような)のクラスを作成するにはどのようにしたらいいですか?
588 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:34:46 ] class Tree { Tree[] subtrees; }
589 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:36:01 ] ここC++だったorz こんなのでいいんじゃない class Tree { std::vector<Tree*> subtrees; };
590 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:55:38 ] template<typename T> struct node<T> { T value; node* prev; node* next; node* parent; node* first_child; static node* tree_next(node* n){ if(n==NULL){ return NULL; } if(n->first_child!=NULL){ return n->first_child; } return tree_next_no_child(n); } static node* tree_next_no_child(node* n){ if(n==NULL){ return NULL; } if(n->next!=NULL){ return n->next; } if(n->parent==NULL){ return NULL; } return tree_next_no_child(n->parent); } }; for(node* it=n; it!=NULL; it=node::tree_next(it)){ }
591 名前:デフォルトの名無しさん [2008/07/02(水) 18:27:09 ] >>587 C++を使う できない人は他のスレで聞く
592 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 18:47:12 ] >>591 ここってC++スレじゃないのか??
593 名前:デフォルトの名無しさん [2008/07/02(水) 20:33:00 ] >>592 そうだけど、あの聞き方ではhello worldから教える必要があるだろ
594 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 20:53:29 ] 俺も興味あるんだが多階層にクラスを定義した場合下みたいな使いかたってできる? Aclass.Bclass.element = NULL 昔クラスのpublic下にクラスを定義し派生用の関数で増やせるようなものを作ろうとしたんだがうまくいかなかった記憶があるもんで…
595 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:03:01 ] class Hoge { const char msg="nullpo"; } これだとエラー出ますが、こういうことをconst付けてやるにはクラス外に書くか クラス.cppの方に書くか、もしくは使用する関数の中で書くしか無いのでしょうか。
596 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:03:35 ] 大体型がおかしいだろ。 staticつけとけ
597 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:22:21 ] よーだょ。 ただしbool/char/short/int/long系に限りできる。floatは×
598 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:23:55 ] どうも、static付けてみます
599 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:40:22 ] enumが便利だよ
600 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:45:09 ] あ、なるほど。すっかり忘れてました。
601 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 00:45:52 ] C++0x出たら、ハゲはプログラミング言語C++の改訂版だすのかな? なんか第3版の次の版が洋書では出てたけど、日本語版はスルーなのかな。 まぁこのタイミングでだしてもしょうがないし、できればC++0x反映させた 版を出して欲しいけどね。
602 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:10:26 ] const 定数のみのクラスってどうやってかけばいいのですか? あとこういうエラー用の定数クラスは1枚のファイルに1こずつ 定義するのが流儀?
603 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:14:11 ] Javaじゃあるまいし
604 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:29:34 ] >>602 なんでクラスの中に定義する必要があるの せいぜいネームスペースでいいじゃん
605 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:34:25 ] シングルトンですけど、boostに入ってないですよね? Lokiぐらいしかないんでしょうか?
606 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:45:21 ] すみません、素朴な疑問なのですが C++ではハードあるいはOSレベルの例外(例えば零による除算)は 通常どのように扱うののでしょうか? もう少し具体的に言うと、例えばVC++なら_ _try, __except という 構造化例外のための機能が提供されていますが、 gccなどの他のコンパイラではこれと同様な機能を実現する手段は ないのでしょうか。 windows, linux 双方で稼動させる必要のあるシステムを作るとしたら、 例外処理をどのようにするべきなのか非常に疑問です。
607 名前:606 mailto:sage [2008/07/03(木) 01:47:54 ] うーん・・・ msdn.microsoft.com/ja-jp/library/cc440193 (VS.71).aspx >C++ でプログラミングしたり、コードに移植性を持たせたい場合は、 >可能な限り標準 C++ の例外を使うことを強くお勧めします。 developer.mozilla.org/ja/docs/C%2B%2B_Portability_Guide >例外は、幅広くは実装されていない C++ の次なる一例です。 >そのため、それらの使用は C++ の移植性を低下させます。 >例外を使ってはいけません。運悪く、同じような機能をもったよい代替案はありません。 例外についての注意勧告がされていますが、では実際にどうするかという 代替案はないということなのか・・?
608 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:55:31 ] >>605 209.85.175.104/search?q=cache:FXdOX_s6DgAJ:pc11.2ch.net/test/read.cgi/tech/1192662575/386-411+singleton
609 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:56:59 ] 鼻から悪魔という言葉があってな
610 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:05:31 ] >>607 俺はWinCE用のソースとかでは std::auto_ptr<std::exception> を戻り値にしてる。 コンストラクタで失敗したものは fail() で返す。 で、毎回戻り値などのチェック。 パフォーマンス悪そうだし面倒なので全部そうしてるわけじゃないけど。
611 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:09:18 ] >>607 VC++の話をすると、/EH系のオプションがあって最適化やパフォーマンスの関係で使い分ける。 オプションなしの場合C++例外は一切使わない。 /EHs(c) 同期例外だけをキャッチする。c で extern "C"関数は例外を発生させないと仮定する。 /EHa 同期と非同期例外をc++例外としてキャッチする。 で /EHaの場合は stack overflowを除くほとんどのハード系の例外をキャッチ出来る。 もちろんゼロ除算も。
612 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:09:23 ] >>608 どうもです。 detailsの中にあることにはあるんですね。 とりあえずkろえを使っておきます。
613 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:26:36 ] >>610-611 ありがとうございます。 VC++の場合はわかるのですが、 gccなどでは同じような処理を行えないのでしょうか? メモリの不正アクセスにしろ零除算にしろ、いくらでも 起こりうる例外だと思うのですが、Javaのように 統一的にcatchできないものかと悩んでいます・・・。 実際、至るところで零除算の起こりうる数値解析の ようなシステムを作ったとして、いざシステムを起動 したら零除算で処理が中断したが、どこで起こったかは わからない、なんてことは有り得ないですよね・・?
614 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 03:24:19 ] gccというよりunix系だとそういうのはsignalではないかな。 ゼロ除算ぐらいなら例外ではなくてプログラムで事前にチェックすべきもので、 メモリの不正アクセスはデバッグ時に潰すべきもので、 例外でキャッチしてリカバリーをかける類のものじゃない。
615 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 05:55:32 ] >>585 最初から vector<shared_ptr<parent> > だけ使ってればいいんじゃね?
616 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 05:59:33 ] >>594 struct { struct { void* element; } Bclass; } Aclass; よくわからんが、これでやりたいことができたことになるの?
617 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 06:33:36 ] >>607 どこまでの移植性が必要かで判断すればいい。 Windowsだけなら構造化例外を使ってもいいだろうし。、gccあたりを含めるならくらいなら例外は使えるだろうし。
618 名前:デフォルトの名無しさん [2008/07/03(木) 09:30:37 ] >>607 mozilla のページ、情報がえらく古いな もっとも古いというだけでは済まされない記述も散見されるが
619 名前:585 mailto:sage [2008/07/03(木) 10:09:51 ] >>586 目からうろこがぼろぼろでた気分です。 ありがとうございました。
620 名前:デフォルトの名無しさん [2008/07/03(木) 12:12:50 ] shared_ptrをメンバとして持つクラスで、そのメンバを取得したいとき、 getBBB1, getBBB2, getBBB3の実装をした場合、状況によるんでしょうが、適切なのはどれか教えてもらえないですか。 それぞれのメリット、デメリットがはっきりとわかっていません。 class AAA { private: shared_ptr<BBB> bbbptr; public: AAA() { bbbptr = new BBB; } shared_ptr<BBB> getBBB1() { return bbbptr; } shared_ptr<BBB>& getBBB2() { return bbbptr; } BBB* getBBB3() { return bbbptr; } };
621 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 12:55:48 ] 状況による面もあるけど、 基本的にBBB1以外は間違った使い方だと思っていい。
622 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:00:22 ] #include <stdio.h> int main(void) { float f; for(f=1.0; (int) f<=5; f=f + 0.1) printf("%f \n", f); return 0; } このプログラム実行したら 2.600000 2.700000 2.799999 2.899999 2.999999 3.099999 3.199999 3.299999 3.399999 3.499999 と2.7から普通に計算できなくなりました 2.700000 2.800000 2.900000 と計算するようにしたいのですがどればいいですか?
623 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:07:39 ] >>622 float -> double もしくは 二進化十進表現でgoogle
624 名前:デフォルトの名無しさん [2008/07/03(木) 13:16:32 ] >>623 できました>< floatって精度かなり悪いみたいですね・・・
625 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:40:07 ] >>622 つうか思いっきりC言語じゃね?
626 名前:デフォルトの名無しさん [2008/07/03(木) 13:48:35 ] Cで利用されることが推奨されているDLLがあって、そのヘッダファイルがC用に提供されていて、 それをC++で利用できない場合って、どういう理由が考えられますか? できない場合があるとしたら、回避方法は、自分でヘッダを修正するってことでしょうか?
627 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:57:25 ] マングリング extern "C"
628 名前:デフォルトの名無しさん [2008/07/03(木) 16:25:02 ] >>626 #ifdef __cplusplus #error C++ is not supported #endif とか書かれてるなら諦めるしかないだろ。
629 名前:デフォルトの名無しさん [2008/07/03(木) 17:52:58 ] 誰か教えてください。。。 現在プログラムでマウスクリックをさせるものを作っていて、 ボタンのクリックなどはできるようになったのですが、 タブ(TabControl)の切り替えができません。 だれかご存知の方がいましたらご教授いただけると助かります。。 以下プログラム抜粋---------------------------------- POINT pt = {任意の座標X , 任意の座標Y}; HWND hWnd = ::WindowFormPoint(pt.x , pt.y); // マウスを任意の位置に移動 SetCursorPos(pt.x , pt.y); // クリック (Down -> UP) ::SendMessage(hWnd , WM_LBUTTONDOWN , 0 , MAKELPARAM(pt.x , pt.y)); ::SendMessage(hWnd , WM_LBUTTONUP , 0 , MAKELPARAM(pt.x , pt.y)); よろしくお願いします。
630 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 18:03:14 ] スレ違い、Win32APIスレで聞いたら
631 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 18:18:18 ] >>620 BB1は安全。戻り値最適化が期待できるので速度も十分 BB2は参照が生きているうちにAAAが削除される場合に問題が発生するが、それに気をつければ高速に使える。 BB3は危険。別のshared_ptrに戻りを代入するミスを誘発しそう。
632 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 23:49:12 ] BBB2も代入できるだろ
633 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:52:38 ] C99では if (...) statement...; else statement...; などのstatementがそれぞれ{}で囲まれたように扱われるようですが これはC++から来たものなのですか?
634 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:54:36 ] 元から (C89から) そうでは?
635 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:59:52 ] C99よく知らないんだけど、 囲まれたように扱われる場合と 囲まれたように扱われない場合って何が違うの?
636 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:08:27 ] 変数のスコープのこといってるんじゃね?
637 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:11:41 ] >>636 そもそも{}で囲まないと変数は定義できないだろう。
638 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:14:32 ] もともとif文の構文は if (expr) statement [ else statement ] expr ; の形の単文はstatementだから{}で囲む必要は無い 複文はstatementではないから、{}で囲んでstatementにしなければならない そんだけのことだ C99とかは関係ないだろ
639 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 23:36:13 ] seclan.dll.jp/c99d/c99d07.htm#dt19991108 「選択文と反復文のブロック化」のことだな。 C++にもあるぞ、X3014:2003「6.4 選択文」の1, 2節目などなどに規定がある。 そこではこういう例が載せられている。 if (x) int i; このルールによって、if文を抜けたらiはもう使えないという具合。 >>637 C++だと、ブロック内の宣言は文だから、できるんだなこれが。 C99だと(なぜかC++と違って)文ではないから、お前の言うとおり出来ないけどな。
640 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 04:17:21 ] >>639 そんなVC6の時代の知識で語られても。
641 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 04:23:29 ] VC6でお世話になったマクロの意味がわかる #define for if (0); else for
642 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:09:27 ] #define 定義は極力使わない方がいい、と、セキュアプログラミング系の本に書いてあったが
643 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:13:43 ] >>642 それは生兵法というもの
644 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:30:48 ] #define SubclassWindowみたいなマクロは死ねばいいと思う 使うならせめて大文字ですよね
645 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:51:36 ] >>642 OpenSSL脂肪wwwwwwwww
646 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 14:42:59 ] あとで#undefで即死されるマクロはいつもasdfだとかzxcvだとかに命名してる
647 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 16:56:32 ] >>646 のコードはメンテしたくない。
648 名前:デフォルトの名無しさん [2008/07/06(日) 20:25:50 ] 同じく
649 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 08:09:21 ] hogehogeマクロ内でboost.pp.repeatとかつかってて子マクロが必要なら、 hogehoge_iとかhogehoge_iiにしてる。 後で#undefで即死されるのは同じだが。
650 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:13:06 ] while(1)中のswtch文で特定のcaseの場合whileから抜けたいのですが2重の構造をbreakさせる方法はありませんか? gotoで抜ける手も考えましたがあまりスマートな方法じゃないのでできれば避けたいです
651 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:13:48 ] while(1)をやめる
652 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:19:50 ] whileの代わりにgotoをつかえばいい
653 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:26:15 ] >>650 フラグかgotoのどちらかを選ぶんだ。
654 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:29:06 ] >>650 そのwhileブロックは、breakをreturnに変えて 何らかの意味のある名前を付けられるくらいの処理ではありませんか?
655 名前:650 mailto:sage [2008/07/08(火) 00:40:53 ] whileを続行するかどうかのフラグ判定式に変更しwhileを抜ける場合はFALSEにセットしてからcontinueすればいい
656 名前:650 mailto:sage [2008/07/08(火) 00:42:49 ] ということに気づき自己解決しました。 レスありがとうございました (うっかりEnterと一緒にShiftを押してしまい途中で書き込んでしまいました…)
657 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 05:41:19 ] あくまで自己解決と言い張るならもう質問すんなよ
658 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 06:09:44 ] 何怒ってんだよw
659 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 06:25:05 ] 657は別に怒ってないと思うが、658はなんでちょっぴり興奮してるんだろ、とは思う
660 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 09:38:38 ] >>653 でフラグ使えと書いてるのに、そんなレスみるまでもなく自分で解決したよ と言うからだろうw
661 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 09:56:40 ] 時間を鑑みるに、おっきしてるのを鎮めてる最中だったんだよきっと
662 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:15:01 ] 自分のレスの後、同じような内容で 自己解決したと書かれたくらいで、もう質問すんなとか、 もうちょっと心に余裕を持った方が良いかと。
663 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:20:05 ] 良いなぁこの馬鹿をかばう気持ち悪い空気
664 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:23:10 ] 相当頭に来てる御様子ですね。
665 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:27:14 ] 自己解決と書くのは、質問者が「お前ら役立たず」と言ってるようなもんだからなw
666 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:35:03 ] >>664 ていうか、こう書けば誰を馬鹿と思ってるのかがわかると思ったんで。 なるほどね。
667 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:46:23 ] >>666 >>662 の後に>>663 なら、普通は 「>>650 (馬鹿)をかばう気持ち悪い空気」と捉えるでしょう? そこでこう書けばというのは、それこそ馬鹿丸(ry
668 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:48:25 ] もう質問者にとって、このスレは用済みだからこねえよ
669 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 12:42:48 ] >>667 うん、こう書けば、無駄に食い下がるかどうかで痛い人かどうかがわかると思ったんで。 なるほどね。
670 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 12:49:02 ] オレには悔しいから一歩引いた視点の第3者を装って「なるほどね」と書いてるように見える。
671 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 12:50:18 ] >>669 それは自虐ギャグですか?
672 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 16:19:05 ] unique_ptrって本当にC++0xに入ってくれるんだろうか
673 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 16:47:35 ] ばかばっか
674 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 17:18:49 ] >>673 お前がな
675 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 17:26:45 ] >>674 オマエモナー
676 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 17:27:46 ] いってよし?
677 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 18:06:30 ] 逝ってよし
678 名前:デフォルトの名無しさん [2008/07/08(火) 22:11:51 ] >>650 なぜスマートな方法ではないと思うのかを誤魔化さずきちんと述べよ
679 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 22:13:35 ] gotoは悪って(事実かどうかは別にしても)よく言われてるからだろ。 多分。
680 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 22:38:18 ] 初心者スレと分けてる意味が無いように思う
681 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:33:06 ] 初心者スレってVC++しかなくね?
682 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:33:08 ] newで動的確保をする際の質問なのですが Base* foo = new Base(int bar); この書き方だとBaseの引数付きコンストラクタが呼ばれる事はわかるのですが 動的に配列を確保する場合に引数付きコンストラクタを呼ぶ事は可能なのでしょうか? イメージ的には↓のようなことをしたいです Base* foo = new Base[3] {Base(int bar), Base(int bar), Base(int bar), };
683 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:37:08 ] 出来ません
684 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:37:54 ] >>683 ありがとうございます
685 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 07:03:55 ] 一度配列か何かを確保しておいて、そこにforで引数付きコンストラクタをnewして回せば解決する。 デストラクタに注意
686 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 12:38:32 ] まずメモリに連続した領域内に生成したいものが、ほんとうに クラスのインスタンスじゃないとダメなのか再考してみたら?
687 名前:デフォルトの名無しさん [2008/07/09(水) 12:41:11 ] 引き数つきのnewか…これはわりと難しいので、 あとで初期化用メソッドを呼ぶかポインタの配列にしたほうがらくちん。
688 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:09:17 ] VC6以前のVS持っている人はいませんか? DDE spyを分けて欲しいのですが・・・
689 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:18:31 ] 2.0のなら転がってるPCのHDDあされば出てくるかもだが・・・
690 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:56:05 ] >>688 それってダメなんじゃないの?
691 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 20:48:29 ] >>682 vectorじゃだめなのかい?
692 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 06:15:03 ] 最新のVC++コンパイラって、C99に対する完全な上位互換を持っていると 思っていいの?
693 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 07:29:57 ] C99はまだスルーされてる
694 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 11:04:51 ] まだどころか多分永遠にスルーされる 今の所C99に準拠しているのはIntel C++程度
695 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 11:05:45 ] C99なんて有ったの… とか
696 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 12:30:01 ] 対応させるメリットないしな
697 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 14:39:59 ] 一行コメントと関数途中やfor初期化部での変数宣言に対応してくれればあとはいいや
698 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 15:25:18 ] たしかVC++チームのブログのコメント欄だかで、C99対応してくれってユーザの声はほとんど無いって言っていたような。 C99のいくつかの有用な機能、一行コメントだとか、restrictだとかは取り入れたが、C99全部入れても、誰も使わないしなぁ。 Variable-length arrayなんて、いまどき誰が使うんだ。
699 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 15:51:39 ] C++があるからねえ・・・
700 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 16:16:02 ] gccでは可変長配列に対応してたりするけどな
701 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:36:42 ] C99欲しい人は何が目当てなの?
702 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:39:47 ] >>698 歴史的経緯でalloca()が実装されてないから、可変長配列はあれば便利だぞ。
703 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:04:05 ] >歴史的経緯でalloca()が実装されてない どこのはなし?
704 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:53:10 ] stdint.hが欲しいんだ。
705 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:07:41 ] よろしい
706 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:49:43 ] そもそもallocaはC89、C99の規格の中には存在しない。 ありゃPOSIX規格のモンだ。 このスレ的にはWin32 APIと同等に扱われるべき環境依存の関数。 なんだけど、itoaとかと同じで、事実上無視できない存在ではあるね。 とはいえ、90年代ならまだしも、 今日び、スタックからわずかなメモリを確保できたところで、それほど利点も無いだろ。 現代なら定数時間でメモリを確保解放できるメモリプールで良いじゃん。
707 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:24:39 ] C99を策定していた委員会の連中もC++98がこれだけ 広く使われるようになるとは夢にも思ってなかったろう。 でないとあれだけ緻密なC99の規格、しかもC89と互換性を 犠牲にしてわざわざ新しい規格を作るはずがない。
708 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:42:07 ] >>706 >702は、POSIXにはあるallocaがWin32にはないから、代わりに使いたいと言ってるんじゃないかと。 確かに、freeする必要がないメモリを好きに取れるのは楽かもしれんね。 それこそ、今時スタックサイズをけちることもないんだし。
709 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:50:59 ] ケチる必要は無いかもしれんが多用するのはバカのやることだぞ。 例えば、VCのリンカのデフォルトのスタックサイズは1MBだ。 何GBもメモリがある時代にたったの1MBだぞ。 *unixのことはよく知らんが、そう変わらんだろうよ。 現状の32bitコードで、スタックサイズが大きすぎると、 スレッドを数十個作っただけで、無駄にアドレス空間が浪費される。 だからスタックのサイズは小さいんだよ。
710 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 21:06:44 ] >>708 _alloca()ならVC++でも普通に使えるよ
711 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 21:50:21 ] こんなこともallocaと って一度言ってみたいです
712 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 22:03:10 ] |:;:;:;:;:;:;:;:;:;:;:;:;:;:i;:;:;:;:;:;:;:;:;:;:;:;:;| |;:;:_:;:_:;:_:;:_;:;_:;:l:;_;:_:;:_:;:_:;:_;:_;| |______|_____| | 三| _ _ |三 ! | 三| 三シ ヾ三 |三 | | 三′ .._ _,,.. i三 | ト、ニ| <でiンヽ ;'i"ィでiン |三.| ', iヽ! 、 ‐' / !、 ーシ |シ,イ i,ヽリ ,' : !. |f ノ ヾ! i ,、 ,..、ヽ lノ | _ _ イ l malloca l ,ィチ‐-‐ヽ i /、 ゙i、 ゝ、二フ′ ノ/'"\ | \ ー一 / / _,ン'゙\ ,ィ|、 \ /_,、-'" _,.-''´ `丶、__ _, イ | ヽ_ 二=''" _,. -''´ """""´´ ``ー
713 名前:デフォルトの名無しさん [2008/07/10(木) 22:19:03 ] alloca は gcc の configure でもチェックあるよな
714 名前:デフォルトの名無しさん [2008/07/10(木) 22:20:10 ] > バカのやることだぞ まだそんなカキコしてるんですか? にっぽんのドクターさん
715 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 23:11:49 ] プログラム=PCアプリだと思ってる連中は気楽でいいのう・・
716 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 23:15:46 ] どう気楽なのかキッチリ説明してもらおう。 (と言ってみる
717 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 00:06:24 ] C99は無かったことにならないかな。下手にこんなのがあると、コンパイラ ベンダーが、C99実装しかねない。
718 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 00:13:54 ] たいていのコンパイラベンダはC++を優先するだろ sizeofがコンパイル時定数にならないとか悪夢過ぎるだろ
719 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 00:51:13 ] ・conio.hを何とかして欲しい。 ・stdint.hの声が何故大きくない?
720 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 00:58:56 ] それにしてもC++自体が変態化してきて誰にも使われなくなりそうな気がするのは俺だけだろうか
721 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 01:06:43 ] おれのVC++のソース、alloca普通に便利に使ってる
722 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 01:26:23 ] C++はいろいろ変な部分があるが、 代わりになるいい言語がないのも事実 web限定とかだとPerl系に軍配が上がるが
723 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 01:40:53 ] C++0xはC99みたいな立場になるだろうな そして代わりに○○が台頭する ○○にはお好きな言語をどうぞ
724 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 01:55:57 ] Obj-C
725 名前:デフォルトの名無しさん [2008/07/11(金) 01:58:45 ] アプリケーション(ダイアログ)に表示された文字を外のアプリケーションから取得する方法ご存知のかたいませんか?
726 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 02:01:16 ] D言語がいつか主流になる・・・ そんな風に考えていた時期がありました・・・
727 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 02:20:56 ] >>725 君がすれ違いだということだけは、はっきりわかる。 プラットフォームすら記載されてないので、どのすれが適当かはしらん。
728 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 03:03:54 ] >>726 今ひとつ流行らんよなアレ
729 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 04:15:06 ] >>728 だってDは、「言語仕様が確定=開発終了」だもん。 D1の仕様は決まったけど、D2のほうが進歩してるのに誰がつかうよ。
730 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 12:54:57 ] 仕様と同時に実装が下りてくるってのもエキサイティングだとは思うがね なんにせよ俺は指をくわえて見てるだけ
731 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 02:55:05 ] 無名namespaceについて教えてください。 名前のある名前空間の場合、 namespace hoge{ void f(); } というように宣言して、後で void hoge::f(){} のように定義できますが、名前無しの場合 namespace{ void f(); } として後で定義を書く場合、??::f()というような形式では定義できないのでしょうか? もちろん定義のときも namespace{ }で囲ってやればいいのでしょうが、関数定義のような長いものをブラケットで 囲むというのも、邪魔くさいなぁと思い。
732 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 03:05:35 ] 確かに邪魔くさいが、 だからこそそんなもの使わないですむようしておけって話じゃね?
733 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 03:08:33 ] >>731 >として後で定義を書く場合、??::f()というような形式では定義できないのでしょうか? こういう参照が出来ないからこそ役に立つんだと思う
734 名前:731 mailto:sage [2008/07/12(土) 03:15:56 ] レスどうもです。 基本的に、C++では翻訳単位内でのみ使用する変数や関数は、C言語のような staticを付けるのではなく、無名名前空間を推奨しているようですが、 そうなると関数の定義は namespace{ void f() { } } のようにするということでしょうか。みんなそうしてるのかな。
735 名前:732 mailto:sage [2008/07/12(土) 03:27:22 ] ごめん。 もっとくだらない理由だと思ってた。 "翻訳単位内でしか使わない"っていうことを明示したいなら、 その邪魔くさいnamespaseが(目立つから)役に立つだろうし、 邪魔くさいnamespaseを使いたくないってことは、 "翻訳単位内でしか使わない"っていうことを明示しなくてかまわない と、俺は思うけど。 本当に邪魔だと思うなら、翻訳単位内でしか使わないとか、あきらめなよ。
736 名前:731 mailto:sage [2008/07/12(土) 03:51:39 ] 外部リンケージを持たせたくない変数や関数の宣言だけを namespace{}に収めるところまでは、目立たせる意味でも 一覧という意味でも非常にスッキリしてると思うんですよね。 ただ、ここに関数のボディまで書いてしまうと、一望しづらくなるので 別途書くことになるのですが、関数定義をブラケットで囲むということに 少し拒否反応がでてしまった次第です。ただ、これしか方法がないなら そうするしかないですね。邪魔だから使わないというわけにもいかない 機能ですし。あとは、関数定義1つ1つをnamespace{]で囲むのか、複数の 関数定義をまとめてnamespace[]で囲むのか、こだわれるところとしたら そのくらいですか。
737 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 04:02:32 ] すごい余談だけど、目立たせなくてはいけないのは、関数本体だと思うんだ。 関数本体をメンテナンスするとき、どの関数に使用されているかが問題になるので。 宣言が目立たないと、間違って呼び出そうとしてリンクエラーでるじゃん? それもいやじゃん? ていわれりゃそうなんだけどさ。
738 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:09:05 ] templateで、doubleとfloatだけしか使えないようにするには、 何か書き方があるのでしょうか。教えてください。 template<typename T> void hoge(T arg);
739 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:30:51 ] template<typename T> void hoge(T arg){return;} void hoge(double arg); void hoge(float arg);
740 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:33:12 ] >>738 template<typename T> struct hoge_chk{hoge_chk(){ use_float_or_double(); }}; template<> struct hoge_chk<float>{}; template<> struct hoge_chk<double>{}; template<typename T> void hoge(T arg){ hoge_chk<T>(); ... }
741 名前:740 mailto:sage [2008/07/12(土) 08:35:10 ] use_float_or_double()は定義されていない前提ね。 コンパイルエラーにさせるため。
742 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:39:49 ] template<typename T> void hoge(T arg); template<> void hoge(float arg) { } template<> void hoge(double arg) { } でいいじゃん。
743 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:44:11 ] >>739 >>742 それだと void hoge(float arg) {} void hoge(double arg) {} と同じだし、それぞれ実装書かないといけないから テンプレート関数にする意味無いだろw
744 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:45:47 ] template<typename T> void hoge_impl(T arg) {} template<typename T> void hoge(T arg); template<> void hoge(float arg) { hoge_impl(arg); } template<> void hoge(double arg) { hoge_impl(arg); }
745 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:52:53 ] >>743 同じじゃねーよ。そのコードでhoge("hogehoge")はエラーだけど>>739 と>>742 はエラーじゃない。 テンプレートにする意味がないっていうのは質問者に言えって。
746 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:55:57 ] >>745 いや、hoge("hogehoge")で>>742 はエラーになるよ。
747 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:56:00 ] >>744 だから下のテンプレート関数は意味無いってw それでやるならこうだろ template<typename T> void hoge_impl(T arg) {} inline void hoge(float arg) { hoge_impl(arg); } inline void hoge(double arg) { hoge_impl(arg); }
748 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:59:00 ] 質問者がdoubleとfloatだけしか使えないように、と言ってるので 使えてしまう>>739 も駄目だな
749 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:04:54 ] >>745 >テンプレートにする意味がないっていうのは質問者に言えって。 >>740 と>>747 はテンプレートにする意味あると思うけど。
750 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:16:21 ] >>747 テンプレートの特殊化は関数の多重定義に優先するから 意味が違う
751 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:21:25 ] >>750 意味分かって言ってる? それで困る「まともな状況」書いてみ
752 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:22:41 ] テンプレートの特殊化と関数の多重定義を二つかくと 関数の多重定義の方が無視されるだろ
753 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:25:48 ] >>752 >テンプレートの特殊化と関数の多重定義を二つかくと それがまともな状況じゃないって言ってるんだよw
754 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:26:34 ] >>753 メンテナンスの程度次第ではいくらでもあり得る。 まともかまともな状況じゃないかはお前が判断する事じゃない。
755 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:27:36 ] >テンプレートの特殊化と関数の多重定義を二つかくと >関数の多重定義の方が無視されるだろ これ逆だよ。関数の多重定義の方が優先される。 だからテンプレートの特殊化と関数の多重定義は混ぜて 書くべきじゃない。
756 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:31:38 ] >>754 ワロタwどんな糞メンテナンスだよw
757 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 12:06:44 ] あれ?オーバーロードの方が特殊化より優先するよな?
758 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 12:52:15 ] >>757 >>755
759 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 12:38:07 ] boostスレ過疎ってんな・・・w
760 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 13:14:51 ] このスレ過疎ってるのでしょうか? この話題↓で盛り上げてください! やねう企画代表者やねうらお(本名・磯崎元洋)が ・ソフトウェアの不正コピーを行っていた ・労働契約上の違反をしていた ・他は不正コピーしていないことを証明しようとしてエロゲーのパッケージを発見し、 写真に撮ってアップロードしようとした。 d.hatena.ne.jp/pmoky/19000106 やねう企画の裏側(競馬の詐欺ソフトの製作現場) d.hatena.ne.jp/pmoky/20060510 d.hatena.ne.jp/pmoky/20060511 d.hatena.ne.jp/pmoky/20060512 有限会社やねう企画(所在地・大阪府八尾市末広町2−1−2)が計画倒産 www.sia.go.jp/~osaka/zenso/19.09.pdf やねうらおプロフィール 性格:友達から「チンピラ」「ヤクザ」と呼ばれている。前世で殺人鬼だった宿業を背負っているという妄想(自覚)あり。 最終学歴:専門学校卒 主な職歴:有限会社センキ(凌辱系アダルトゲームの製作会社)を経て独立、有限会社やねう企画を設立、2006年に計画倒産 代表作:『夜這いマニア』『盗撮マニア』『お楽しみCDシリーズ』『競馬詐欺ソフト』『BM98』 やねうらお語録 >「ワシのほうが潔癖やと思うんやけどな。 >絶対に違法コピーのソフトしか使わんし。 >たとえば強盗に入ったときに、ちょっとかわいそうになって >十万円だけ残してったら、おかしいやろ? >自分の『強盗する』という意思に対して矛盾やろ? >だからワシは、一個も買ったソフトを使ったことがない!!」
761 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 13:18:26 ] 759 :デフォルトの名無しさん [sage] :2008/07/13(日) 12:38:07 boostスレ過疎ってんな・・・w 760 :デフォルトの名無しさん [sage] :2008/07/13(日) 13:14:51 このスレ過疎ってるのでしょうか? 日本語が不自由のようだなw
762 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 14:27:07 ] キーワードによる自動コピペ
763 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 14:49:07 ] memset や memcpy の動作について質問です。 memset(buff, 0, 0); や memcpy(buff, work, 0);
764 名前:763 mailto:sage [2008/07/13(日) 14:50:35 ] すみません、途中で送信してしまいました。 memset(buff, 0, 0); や memcpy(buff, work, 0); のように サイズが 0 の場合、何も行われないという認識で合っていますか? MSDN では分らなかったです。
765 名前:デフォルトの名無しさん [2008/07/13(日) 15:06:56 ] サイズ 0 ならガッされないなんて知ってても役に立たんだろ
766 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 15:09:41 ] >>764 そういう場合、不安だったらmy_memsetかなんか一個かましておけ
767 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 15:12:29 ] >>765 関数の呼び出し元にバッファ領域のポインタと領域サイズを渡させる場合に役に立ちます memset や memcpy にサイズ 0 を渡しても大丈夫ということであれば、 領域サイズに 0 が指定された場合のエラーチェックをせずに済むケースがあるからです
768 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 15:25:06 ] 規格書にはn文字ほげほげするとだけしか書かれてなかった希ガス。 詳しく知りたければJISのサイトでX3010を検索。
769 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 15:25:19 ] >Where an argument declared as size_t n specifies the length of the array for a >function, n can have the value zero on a call to that function. Unless explicitly stated >otherwise in the description of a particular function in this subclause, pointer arguments >on such a call shall still have valid values, as described in 7.1.4. On such a call, a >function that locates a character finds no occurrence, a function that compares two >character sequences returns zero, and a function that copies characters copies zero >characters. 0を渡すことはできるが、その場合でもNULLはダメらしい
770 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 15:44:01 ] >>766 なるほど、それは確かに賢いやり方ですね。 ちょっと考えてみます。 >>768 調べてみます。 >>769 NULL チェックだけは避けられないということですね。 やはり、エラーをチェックする自作関数をかました方が良いのかもしれないですね。
771 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 18:18:24 ] 宣言と定義が別々になってるコンストラクタで、初期化リスト使う場合って 宣言と定義両方に初期化リストつけなきゃいけないんだっけ?
772 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 18:20:42 ] 定義の方だけ class A { int a; A(); }; A::A():a(0){}
773 名前:771 mailto:sage [2008/07/13(日) 18:25:33 ] ありがとう。
774 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 05:20:26 ] === hoge.h === class hoge { public: template<typename T> T func(T a) const; }; === hoge.cxx === #include "hoge.h" template<typename T> T hoge::func(T a) const { return a; } === main.cxx === #include "hoge.h" int main() { hoge h; int a; h.func(a); return 0; }
775 名前:774 mailto:sage [2008/07/14(月) 05:22:22 ] GCC 4.0.1で、 $ g++ -c hoge.cxx -o hoge.o $ g++ -c main.cxx -o main.o $ g++ main.o hoge.o -o main Undefined symbols: "int hoge::func<int>(int) const", referenced from: _main in main.o ld: symbol(s) not found collect2: ld returned 1 exit status となってしまいます。 templateのメンバ関数というのは、これではまずいですか?
776 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 05:41:04 ] まずいです。 h.func(a); を書いたソースから hoge::func の実装が見えるようにして下さい。 ようするに hoge.h に実装を書いてください。
777 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 05:50:17 ] >>775 exportキーワードをサポートしてないC++処理系では無理
778 名前:774 mailto:sage [2008/07/14(月) 06:14:12 ] >>776-777 まじですか。なんともめんどくさい。 設計からやり直さないと。 ありがとうございました。
779 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 20:11:37 ] VC++ 2008はもうexportをサポートしてる?
780 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 20:14:37 ] ネイティブコードなんてシロモノはOSぐらいしか使わないような世界になったなら、 exportもサポートされるかもな。
781 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 20:19:25 ] じゃあ2008でも未サポート?
782 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 20:57:28 ] >>780 なんで?
783 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:23:50 ] 今やオブジェクト間最適化が当然の如く行なわれている。 export実装がそんなに困難であるはずがない。
784 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:29:47 ] コードレベルで保持しないとダメだから難しいでしょ。 D言語はうまいことやってるけど。
785 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:31:36 ] そろそろVC++2008でexportが実装されてるか教えてくれてもいいだろう
786 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:33:17 ] >>785 それがないんだな。
787 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:39:11 ] うそ〜ん
788 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:49:19 ] exportが実装されるまでvcはスルー確定だな
789 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 01:19:30 ] じゃ、どのコンパイラ使う気?
790 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 01:23:38 ] Cマガってもう再開しないのかな。
791 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 01:25:14 ] exportはおまえらが想像する程素敵じゃないのよとEffectiveC++3版にかいてあるよ
792 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 01:28:06 ] Comeau
793 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 08:20:16 ] ところでMore Effective C++が第2版になっても訳が最悪で読みづらいらしいが 実際どうなの?読む価値ナッシングぅ?
794 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 21:27:54 ] >>793 読解可能なら原書を。 そうでないなら、項目を中心に辞書的に活用。 読む本としては厳しい。
795 名前:デフォルトの名無しさん [2008/07/15(火) 22:33:14 ] 「訳が最悪」という論評は原著が熟読できていて初めて可能 そうでなければ他人の論評の受け売り
796 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 22:36:38 ] 日本語版しか読んでないけど、読みにくいのは確か
797 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 22:47:18 ] 2つの補い合う16ビット整数について学べる本だと聞いたのだが本当かな?
798 名前:デフォルトの名無しさん [2008/07/15(火) 23:37:13 ] 原著が糞かどうかは見えていないわけか
799 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 02:18:51 ] >>793 新訂版は知らんが、旧版についてなら>>794 でFAだと思う。 はっきり誤訳とわかる箇所が散見される (例:p.139 コンストラクターメンバ関数 → 例示コードでconstメンバ関数とわかる)、 一般的な訳語を使わない(例:省略時コンストラクター)などの問題がある。 訳者まえがきに「翻訳を急いだ」と書いてあるが、そういう問題かなという感じ。 ttp://www.pej-hed.jp/washo/38.html に新訂版の目次があるけど、 少なくとも訳語の問題はあまり変わっていないようす。 訳者は旧版の3人+新任1人なので、自分は読み直す気にはならない。
800 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 02:39:21 ] 800ならC++滅亡
801 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 02:56:32 ] >訳者は旧版の3人+新任1人なので 懲りてないな。 トールキンで言うと戸田&山本の最凶タッグが成立するようなもんか。
802 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 14:34:49 ] 省略時ナントカは JIS X3014 の術語だからなんとも言えないけど const → コンストラクタ は酷いな… orz C++使わない人が訳したんだろうね。
803 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 21:09:25 ] テンプレートを用いる際、引数として与えられた型があるコンセプトを満たすかどうかによって、 異なるテンプレートを用いることはできるでしょうか? 例えば、 template<typename T> class foo { //Tがコンテナの要件を満たしてなければこの実装 }; template<typename T> class foo { //Tがコンテナの要件を満たしていればこの実装 }; という感じのコードを書きたいと思っていますが、 やはりredefinition of 'class foo<T>'と怒られます。 上手く解決する方法はありますか?
804 名前:803 [2008/07/16(水) 21:17:36 ] ちなみに、解決方法は多少技巧的になっても構いません。
805 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 21:38:26 ] >>803 特殊化すればよろし template< typename T, bool is_container > class foo { /* コンテナ以外 */ }; template< typename T > class foo< T, true > { /* コンテナの場合 */ }; is_container を自動的に判定するにはメタ関数を作る必要がある
806 名前:デフォルトの名無しさん [2008/07/16(水) 21:41:40 ] CLIで関数ポインタ配列の宣言がどうしても通らないんです。 よかったら教えてください。 public ref class Form1 : public System::Windows::Forms::Form { public: ... int fn1(int,int); int fn2(int,int); int fn3(int,int); int (*fp[])(int,int){ fn1, fn2, fn3 }; ... 関数ポインタの配列が作りたいのですが、error C4368がでます。
807 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 21:43:35 ] >>806 C++/CLIは最早別の言語なので、専用スレへどうぞ。
808 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 21:45:11 ] >>803 これくらいなら出来る #include <boost/mpl/if.hpp> #include <boost/type_traits/is_integral.hpp> using namespace boost; template<class T> struct Y {}; template<class T> struct Z {}; template<class T> struct X { typedef mpl::if_<is_integral<T>, Y<T>, Z<T> >::type type; };
809 名前:デフォルトの名無しさん [2008/07/16(水) 21:46:08 ] >>805 ありがとうございます。 そのメタ関数の作り方を教えていただけないでしょうか? あるいは、そのようなテンプレートプログラミングについて解説してあるサイトを紹介してくださると助かります。
810 名前:デフォルトの名無しさん [2008/07/16(水) 21:46:10 ] >807 すみません。移動します。
811 名前:デフォルトの名無しさん [2008/07/16(水) 21:57:08 ] >>808 boost::MPLにはあまり詳しくないのですが、 Xが整数型なら X<T>::type == Y<T> 、そうでなければ X<T>::type == Z<T> ということでしょうか。 組み込み型か否かというような判断ではなく、 例えば「Tがメンバにbegin()とend()を持つか否か」や「Tがメンバにoperator()を持つか否か」で、 使うテンプレートを分岐させたいのですが、解決方法があれば幸いです。
812 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 22:27:34 ] >>811 任意の型について >「Tがメンバにbegin()とend()を持つか否か」や「Tがメンバにoperator()を持つか否か を判定することは出来ないと思います x.begin() と呼ぶのではなく begin(x) などと呼んで型ごとにオーバーロードを用意するとかではダメですか? Boost.Range がこの方法を採用して begin を持つ型にひ持たない型にも対応しています 私もたまにそうします
813 名前:デフォルトの名無しさん [2008/07/16(水) 22:38:50 ] >>812 うーん、やはり無理ですか。 コンテナに対するオペレータのオーバーロードを考えていて、 コンテナが高階か1階かによって適用させる関数を変えたいと考えていたのですが、 どうもそういう発想に基づかない実装が必要なようですね。 ありがとうございました。
814 名前:デフォルトの名無しさん [2008/07/16(水) 22:45:39 ] >>799 , >>802 だーかーらー、原著者がかましたボケかどうか確認しろつーの
815 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 23:03:42 ] >>813 役に立たないかもしれないけど、要件はクリア? #include <iostream> template<class T> struct Y { T m; }; struct Z {}; template<template<class T> class C> struct X { template<class A> static void f(C<A> x) { std::cout << "f(C<A>)" << std::endl; f(x.m); } template<class B> static void f(B x) { std::cout << "f(B)" << std::endl; } }; int main() { Y<Y<Z> > y; X<Y>::f(y); return 0; }
816 名前:デフォルトの名無しさん [2008/07/17(木) 00:17:58 ] >>815 この方法だと、型を1つ引数に取るテンプレートクラスか否かで分岐させているということでしょうか。 できればそれに限らないコンテナ(boost::arrayとか)も一括して扱いたいのですが、 確かにvectorやdeque, listに関してはこれで扱えそうですね。 教えてくださってありがとうございます。
817 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 22:37:21 ] テンプレートクラスのインスタンス化についての質問で、 以下のようなことがしたいのです。 ※以下の全ての例は当然コンパイルはできません。 // 動的にテンプレートの型 list* getList(int n) { if(1 == n) { // int型のリストをreturn } if(2 == n) { // double型のリストをreturn } } int main() { // 型情報を持たないlistクラスの変数を用意(したい) list* x; int num; std::cin>>num; // キーボードで入力した値によって型を変える x = getList(num); } このような処理を行いたいのですが、どうにかならないでしょうか… JavaにおけるObjectクラスのようなクラスがあればいいのですが。
818 名前:817 mailto:sage [2008/07/17(木) 22:37:52 ] 私が考えてみたのは (1)typedefを使う (2)マクロを使う で、どちらも上手くいきません。 (1)については、 // typedef の前方宣言(をしたい) typdef typ_t; // 動的に型情報を決定(これだとスコープ的にダメ?) if(1 == n) { typedef int type_t } if(2 == n) { typedef double type_t } // 動的に定まった型を用いてインスタンス化 list<type_t> x; こんな感じにできないかと思ったのですが、 宣言がの方法がわかりませんでした。(できない?)
819 名前:デフォルトの名無しさん [2008/07/17(木) 22:38:30 ] (2)については // とりあえず何か型を設定 #define TYPE_T int // 動的に型情報を決定 if(1 == n) { #undef TYPE_T #define TYPE_T double } if(2 == n) { #undef TYPE_T #define TYPE_T char } // 動的に定まった型を用いてインスタンス化 list<TYPE_T> x; これは n の値によらず最後に #defile された値 が常に適用されてしまい、ダメでした。 (今の場合でしたら常に list<char> が生成されてしまう。) もう本当にお手上げ状態でして、みなさんのお知恵を お借りしたいと思っている次第でございます;; 何卒よろしくお願いします
820 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 22:39:41 ] >>818 最後の行 ×宣言がの方法が ○前方宣言の方法が
821 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 22:57:57 ] >>819 テンプレートクラスを使わずに普通のクラスで対処したらいけないの? class list { /* listの定義 */ };; class IntegerList : public list { /* IntegerListの定義 */ }; class DoubleList : public list { /* DoubleListの定義 */ }; list* getList(int n) { if ( n == 1 ) { return new IntegerList(); } if ( n == 2 ) { return new DoubleList(); } }
822 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:15:06 ] インスタンス化クラスの型はコンパイル時に解決するから、実行時の多態性を実現する目的には向かない。
823 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:20:01 ] テンプレートはコンパイル時の問題を解決するための道具です 実行時には役立ちません 実行時の問題は実行時用の道具で対処したほうが良いでしょう
824 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:29:17 ] >>821 元々の目的が 「テンプレートクラスの型指定を実行時に動的に行いたい」 ということですので、それだと本来の目的に合わないのです。 が、>>822 >>823 さんの仰るように、そもそも本来の目的の 方向性が良くなかったようで…。 一度構成を考え直してみたいと思います。 みなさん、どうもありがとうございました。
825 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:53:05 ] boost.variantじゃ駄目なのか
826 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 04:24:38 ] 今、とある解説書でC++の例外を勉強しているのだが、投げられた例外を 受け取る例外ハンドラがない場合、terminage()が呼ばれabort()が呼ばれると。 abort()は何の後処理もせずプログラムを終了させるから具合が悪いという ことが書かれているのだが、プログラムが終了すればすべてメモリは解放 されるのと違うの?プログラムが終了してまで、何か禍根が残るなんてこと あるの?
827 名前:826 mailto:sage [2008/07/18(金) 04:25:20 ] ミス terminage() → terminate()
828 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 04:33:50 ] >>826 ファイルシステムとかデータベースとか。 mkdir() を使ったロックなんかがわかりやすいかな?
829 名前:826 mailto:sage [2008/07/18(金) 04:39:16 ] レスどうも。 つまりプログラムとは独立したなんらかのリソースを操作する場合に 影響が残るということか…
830 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 04:54:12 ] VC++2008で void f() throw( hoge1, hoge2, hoge3); みたいな例外指定ってサポートされてないんだね。 標準C++勉強してると、意外と最近のコンパイラが標準準拠していない ことに気づく。
831 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 07:57:37 ] むしろ準拠しなくてもOSが「問題ないぜ!掛かって来い冷害!」
832 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 13:08:34 ] 初心者で申し訳ないのですが、 googleのsparse_hash_mapを使おうとして、マニュアル通り #include <iostream> #include <google/sparse_hash_map> using namespace std; using google::sparse_hash_map; .. int main () { sparse_hash_map<const char *, int, hash<const char *>, eqstr> months; とすると、 'hash' was not declared in this scope と、hash<const char *> すら定義されていないと言って怒られてしまいます。 hash_mapの場合も同じだったのですが、どうするといいでしょうか。 環境は g++ (GCC) 4.1.1 20070105, Linux FC6です。 よろしくお願いします。
833 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 13:25:34 ] #include <ext/hash_fun.h> を追加してみてはいかがでしょう。
834 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 14:28:03 ] >>833 ありがとうございます。 もう一度追加してみたのですが、エラーメッセージは同じのようでした。 ちなみに using __gnu_cxx; したり、__gnu_cxx::hash<const char *>と すると、もの凄いエラーメッセージが出ます。。
835 名前:832 mailto:sage [2008/07/18(金) 18:20:56 ] すみません、自己解決しました。 上のコードの struct eqstr の持つ比較関数 bool operator() (const char *a, const char *b) const で、最後の const が抜けていたのが原因のようでした。 using namespace __gnu_cxx; で const を加えると、問題なく通りました。 # たったそれだけで長大なエラーメッセージが表示されるとは、 C++、恐ろしい子・・・!!
836 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 18:31:34 ] 最初の方の数個のエラーだけ見て推測すりゃ良いだろ。 コンパイル時間と長大なエラーメッセージに怖気づくなよ。
837 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 23:32:51 ] >>830 VCはずっとサポートされないままだね。(他は知らないけど) やっぱ難しいんかな。
838 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 23:45:04 ] ζ / ̄ ̄ ̄ ̄\ / | | ⌒ ⌒ /| | (・) (・) ||||||| | ⊂⌒◯-----∂)___ ___ | ||||||||_ / ゙Y" \ \ヽ_/ \/ \ \ / \ / ̄ ̄ ̄ ̄) * ( ̄ ̄ ̄ ̄) | ─< |\ >─ ( | ) / (|ミ;\ ( ) ヽ  ̄ ̄) /(___人|,iミ'=;\ (  ̄ ̄ ) /" ̄ ̄ ̄ ̄ / 《v厂リiy\  ̄ ̄ ̄ ̄\ / / ゙|,/'' v:,,、.¨)z,_ \ / / ミ/ .-─ .゙》z、 \ / / 〔」″ノ‐ 、u ¨\ ) ( / ゙|, ..冫 .rー  ̄\_ | | 〔 ミ./′ ..r-ー __,,ア┐ | | | {. .,,,, .′ .´′ .¨\| | | ∨ ノ冖′ =vvvvvv¨\ | / ミ. ,i' .゙\_ | / .{. ノ ,r¬″ .¨\
839 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 23:49:41 ] >837 実装するだけなら全く難しくないと思うが 関数に try, catch 差し込んで unexpected 呼ぶだけでしょ
840 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 00:32:21 ] 例外指定なんて誰も使わないから別にいい
841 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 16:56:54 ] Javaは例外指定必須だけどうっぜえ割に大してバグが減るわけでもない はっきり言って全くいらない機能
842 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 23:51:23 ] 同意。C#の設計者もアレあんまし意味無いだろって言ってる品。 www.artima.com/intv/handcuffs.html
843 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 07:52:16 ] >>838 これって遠近法で描かれたウンコなのかドリルなのか気になる
844 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 09:28:32 ] 激突 アナル vs ドリル
845 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 10:54:04 ] new/delete演算子をオーバーライドしたいのですが、 これらの中からもとのnew/deleteを呼ぶにはどうしたらよいですか?
846 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 14:57:11 ] 置かれている状況が分からないから何とも言えないけど、 ::operator newと::operator deleteでどうよ。
847 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 17:09:26 ] operator newをオーバーライドしたなら、必要なのはメモリの固まりなわけで、 mallocでも呼んどきゃいいんでね?
848 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 17:58:46 ] >>847 コンストラクタを呼びたいんじゃね?
849 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 18:09:06 ] 「new演算子のオーバーライド」で、どのコンストラクタを呼びたくなるわけ? ひょっとしてたとえば、メモリ管理クラスがあって、operator new()で そのメモリ管理クラスをインスタンス化するためにnewしたくなったけど、 メモリ管理クラスのメモリはどうするんだってな話?
850 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 04:35:49 ] クラスのメンバ関数が、自分自身をdeleteする処理を行っても 安全なのでしょうか? つまりdelete this;ってことになるかな。 自分自身が解体された後にメンバ関数からリターンするって何か変ですよねぇ。 しかもdelete this;の後にも処理が続いてたらやばいですよね。
851 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 06:40:13 ] >>850 安全。ただしもちろん、それやったあとにそのインスタンスを使っちゃいけない。 たとえばboost::intrusive_ptrみたいに、値に自身の参照カウンタを持たせるスマートポインタの場合、 値となる型に void Release() { if (!--refCount_) delete this; } みたいなメンバ関数を用意することになる。
852 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 06:41:32 ] 規格上どうなってるかは知らないけど、そういうことをやってるライブラリは知ってる。 他のメンバーにアクセスせずにリターンするだけなら問題はないような。 実際どっちのデザインがいいのだろ。 A a = A::createInstance(); a.Free(); A::Free(a);
853 名前:850 mailto:sage [2008/07/21(月) 06:50:27 ] レスありがとうございます。 deleteした後に余計なことしなければ、いけるってことですね。
854 名前:デフォルトの名無しさん [2008/07/21(月) 16:09:12 ] 現在ublasを使っていて少しつまづいてしまったので教えていただきたいことがあるのですけど 教えていただけないでしょうか? ある行列を多くの行列演算の和として計算したいのですが、 代入を繰り返すことでおそくなってしまいます。 例えば以下のような例です。 for(i=0;i<100;i++){ MAT1+=some_matrix; } some_matrixには毎回べつの行列が計算されてはいります。 expression template でこれを高速可できるということですが、 for文の中で毎回代入していまうとその時点で式が評価されてしまうので遅くなってしまうようです。 式そのものを変数として保持しておくような事はできるのでしょうか? 初歩的な質問ですみませんがどなたかお願いします。
855 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 16:15:30 ] autoやdecltypeがあればいいんだがなぁ。
856 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 16:36:33 ] draw_mark = rand() % 4 + 1; draw_digit = rand() % 13 + 1; if(h) { printf("%sの%s\n", mark[draw_mark-1], digit[draw_digit-1]); } r = total[draw_digit-1]; この文の+1と-1はあってもなくても結果は同じですよね? 気になったので教えてください
857 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 16:46:49 ] 他の場所で使ってなければ同じ。
858 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 18:23:52 ] 結果は同じでも、可読性が違う。 乱数の結果が+1してあれば「乱数値を1オリジンに変換している」というニュアンスが伝わるし、 配列のインデックスが-1してあれば「カード番号を0オリジンに変換している」というニュアンスが伝わる。
859 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 18:34:07 ] 一方、ロシアは0オリジンで乱数値を扱った。
860 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 18:39:15 ] >>859 そういう無意味な書き込みして楽しい? そうかぁ、寂しい青春送っているんだね。
861 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 18:49:41 ] >>860 >>860