1 名前:デフォルトの名無しさん [2008/08/06(水) 20:56:17 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.57【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1216215558/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
52 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:39:30 ] atan2だと、引数の精度(x,y)がfloatで、戻り値の角度が一周1024ってこと? 45度ごとに場合分けして、小さい方を大きい方で割って、 まあ2048倍して、テーブル2048個から0〜1023を返すようにすりゃいんじゃない? 倍にしてるのは気分的に。
53 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:40:50 ] あ、ちょっと違うか、1週1024なら45度の範囲だとその 1/8のテーブル量で済むわ
54 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 16:25:42 ] どうでもいいけど、atanをあーたんと読むとちょっとカワイイよな
55 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 16:33:17 ] 独学でC++、DirectX、Win32APIでゲームを作り始めたんですが、 いつも設計に悩まされ、綺麗な形にできません。 起動した瞬間開始する単純な2Dシューティングから始まり、 メニュー画面を追加し、一時停止画面を追加し、 エロゲーみたいな会話画面をはさみ、3D描画を入れたりと、 機能追加するごとに、設計がぐだぐだで汚くなっていきます。 プログラムは2chとグーグルだけで覚えたので、 他人が作ったアプリのソース全体を見たことがないんですが、 アプリケーション全体の設計を勉強するにはどうすればいいでしょうか? 何かお勧めの本があったら教えてもらえませんか。
56 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 16:34:22 ] あーくたんもカワユイ
57 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 16:43:22 ] >>55 適当なデザインパターンの本を読んでふむふむと思いつつ、 あとは習うより慣れろで行くしかないと思う。 俺も同じような時期があったから一言だけ言わせてもらうと、 『本当に必要のないものは実装するな』の一言に尽きる。 >>54 こたんはなんか犯罪の香り
58 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:08:08 ] >55 まずは構造化プログラミングですね。>57の言うようにデザインパターンとかってのもあるけど、 >起動した瞬間開始する単純な2Dシューティングから始まり、 >メニュー画面を追加し、一時停止画面を追加し、 >エロゲーみたいな会話画面をはさみ、3D描画を入れたりと、 >機能追加するごとに、設計がぐだぐだで汚くなっていきます。 を見る限りでは、オブジェクトとのマッピングや責務分割を考えるよりも、スパゲッティっぽくなってるのをちゃんと整理する力をつけるのが先かと。 あと、今時、全てを一つのEXEで作らなくても良い、と言うのも重要。
59 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:25:52 ] ゲームだとタスクシステムとかかなぁ
60 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 19:09:19 ] >>43 ありがとう ずっと確保した容量が返ってくるものだと勘違いして使ってた
61 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 19:42:01 ] 確保サイズが知りたい場合は_msizeだそうな(注:Windows限定)
62 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 20:15:29 ] × Windows限定 × VC限定
63 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 20:17:03 ] >>62 ワロタ
64 名前:55 mailto:sage [2008/08/09(土) 20:31:01 ] >>57 まだ、何ができるかをちゃんと把握してないので、 思いついたものや試しをどんどん追加実装してるのが一番問題っぽいですが、 習作なので仕方ないかなとも思います。 実装するものの全体像を把握するまで、慣れるしかないですかね。 >>58 EXEを分割できるとは知りませんでした。 そういう場合、複数EXEで共用するモジュールを作ったりするんでしょうか。 それともまったく独立して複数作るんですか?
65 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 20:57:30 ] >実装するものの全体像を把握するまで、慣れるしかないですかね。 ゲームプログラマーから一言。 あとからいくらでも追加に耐えられるように組むこと。 全体像なんて最初から最後まで同じである保証なんてどこにも無いよ〜 >EXEを分割できるとは知りませんでした。 ニュアンスが違うんじゃないか? ゲームだったらEXE一個だよ。分割なんか考えなくていい。 まあ機能ごとにDLLに分解するのはあると思うが、まだそんなこと考えなくてもいいだろう。
66 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:00:01 ] >>65 拡張性を無視して作って変更が出たら作り直すって手法なかったっけ? 一回やってみたいと思ってるんだが勇気がなんだ
67 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:02:13 ] アジャイル?
68 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:04:26 ] >>66 >拡張性を無視して作って変更が出たら作り直すって手法なかったっけ? かってにすればーw 冗談じゃねー、1回作り直すのに数年かかるわ!
69 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:05:36 ] XP?
70 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:09:07 ] >>67 >>69 ああ、そんなんだった、調べてみる >>68 >冗談じゃねー、1回作り直すのに数年かかるわ! 俺もそう思うんだ、だからやってみたことはない。 でも手法として確立してるからにはどうにかなるのだろうとは思う。 ちょっと調べてみていけそうなら今度提案してみる。
71 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:14:43 ] XPでなんとなく理解できたのはペアプログラミングくらいだったな
72 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:32:10 ] >>52 ,53さんありがとうございます。 また質問になりますすみません。 環境は>>46 と同じです error: cannot convert 'Bullet (*)[100]' to 'Bullet**' for argument '4' to 'void Shot(int, Image*, MyShip*, Bullet**)' という意味はわかるのですがですが、改善法が分からないエラーが出て困っています typedef struct{ 略 }Bullet; Bullet shot[100]; Shot(ctrlmode, bullet, &MyShip, &shot); void Shot(int shot_ctrl_flg, Image* Star,MyShip *MyShip,Bullet *shot[]){略} どこがいけないのでしょうか?
73 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:35:51 ] 構造体の中身を全て = 0 にするにはどうしたらいいですか。 宣言のときなら struct hoge a = {0}; でできると思いますが。 全ての中身に対して = 0 をするコードを書くしかないですか。
74 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:37:22 ] 構造体の中身が全て整数型なら0にmemsetすることで実現できます。 それ以外の場合は0を意味する値を代入するしかありません。
75 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:44:03 ] >>73 struct hoge a; ...; struct hoge zero = {0}; a = zero;
76 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:52:47 ] a = hoge();
77 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:53:49 ] >>72 Shot(ctrlmode, bullet, &MyShip, shot); void Shot(int shot_ctrl_flg, Image* Star,MyShip *MyShip,Bullet shot[]){略}
78 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:55:23 ] >>72 引数shotの型が違う。 Bullet shot[100]; のとき、&shotは配列へのポインタで 関数の仮引数のBullet *shot[]はBulletへのポインタへのポインタ。 何がしたいのか良く分からんけど。 Bullet shot[100]; void Shot(int shot_ctrl_flg, Image* Star,MyShip *MyShip,Bullet *shot){略} か Bullet *shot[100]; void Shot(int shot_ctrl_flg, Image* Star,MyShip *MyShip,Bullet *shot[]){略} こうで、 Shot(ctrlmode, bullet, &MyShip, shot); こうじゃね?
79 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 22:16:58 ] >>78 配列がまずいのですかね? 両方ともやりましたが結果は同じでした・・・
80 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 22:19:24 ] MyShip *MyShipってありなのかぁ…
81 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 22:24:44 ] >>79 結果は同じって同じエラーってこと?
82 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 22:55:22 ] newでchar型の配列を1521090492個以上確保したらエラーがでるのですが何故でしょうか? メモリは4G積んでるんでメモリが足りなくて確保できないってことではないと思うんですが newで確保できるのは1521090492byteまでって決まってたりするんですか?
83 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 22:57:40 ] それはコンパイラを作った人に訊いてくれ。
84 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:09:26 ] どんなエラーよ? 他にもOSとかコンパイラとか色々あるじゃん。書くことが。
85 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:09:59 ] ごめんなさいコンパイルは通るけど、それを実行すると確保するところでエラーでる mlock.cの void __cdecl _unlock (int locknum){ //leave the critical section. LeaveCriticalSection( _locktable[locknum].lock ); } で 0x7d4f2366 でハンドルされていない例外が発生しました: Microsoft C++ の 例外: std::bad_alloc (メモリの場所 0x0012fe40)。 ってエラーがでます これってコンパイラかデバッガの仕様なんですか? ソースはこんなのでnewのところでエラー int main(){ char *p; p=new char [1521090493]; delete [] p; return 0; }
86 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:13:25 ] >>85 そもそもWindowsでは32ビットアプリで32ビット(2GiB)以上のメモリ空間をアクセスする単純な手段は提供されていません。 大人しく64ビットアプリを作るか、ありえないメモリ戦略を諦めることをお勧めします。
87 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:13:45 ] OSはXPx64でコンパイラはVisualStudio2008Proです タスクマネージャでみるとメモリのコミットチャージは newで確保前は470MB/3826MBで充分空いてます
88 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:13:49 ] std::bad_allocでググれば。
89 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:17:44 ] >>86 ありがとうございます。32ビットでも2Gまでならいけるはずですよね とりあえずこんなに確保するつもりは無いんですが、色々試したら[1521090492] を超えたところでエラーがでたので興味本位できいてみただけです。 >>88 ググったら色々情報でてきた。あとは自分で調べてみることにします
90 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:23:14 ] ゲームでアジャイルとかできるんかね。 ゲーム作ったことないけどテストパターンが割りと膨大になりそうにおもう。
91 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:34:15 ] Code::Blocks(MinGWつき)とwxWidgetsをWindows XPにインストールした後、 「壮大な一歩を踏み出すぞ〜」と意気込んで、とりあえずwxWidgetsプロジェクトではなく 以下のコードをビルド、出来上がったexeをコマンドプロンプトにて実行しました。 #include <iostream> using namespace std; int main() { cout << "こんにちわ世界" << endl; } 日本語は文字化けしてしまったので、プロンプトのフォントをMSゴシックに変えたんですが それでも駄目で、壮大な一歩を踏み外してしまいました。 Unicodeがらみの文字化けというところまでは分かるのですが、解決策が分かりません。 Code::Blocks WikiのWxWindowsQuickRefに書かれているBuild wxWidgetsはすでに終えたのですが、 まだwxWidgetsを使う所まで行ってないので、関係ないだろうし。 Code::BlocksとwxWidgetsでC++を始めようと考えていたのですが、かなり道は険しいようです……。
92 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:41:13 ] >>91 ソースコードの文字コードを変えてみては?
93 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:43:18 ] なんでもいいけど、int main なら値返そうよ。 2歩目も怪しい。
94 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 00:00:03 ] >>93 C++ならmainでreturnしないとreturn 0:したことになるって規則があって問題ない。 省略していいかどうかはまた別問題。
95 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 00:02:54 ] UNICODEで文字列を表示したいのか 単に日本語を表示したいのか
96 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 00:23:39 ] >>91 g++なら--input-charset=cp932 --exec-charset=cp932でどう? Code::Blocksでどう設定するかは知らないけど。
97 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 01:00:10 ] ソースをUTF-8か何かで書いてるのかな
98 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 05:48:46 ] これって問題あるでしょうか? struct hoge { int x; }; hoge *ptr; hoge &ref = *ptr; ptr = new hoge; //参照を作った後に確保 ref.x = 1; //参照からアクセス
99 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 06:09:09 ] 問題なし
100 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 08:14:01 ] >>98 問題あり
101 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 08:23:27 ] 問題あり。 refの指している先はnewされたところではない。
102 名前:デフォルトの名無しさん [2008/08/10(日) 08:32:10 ] 動かしてないけど hoge &ref = *ptr; のところで落ちるんじゃない? ptrは無効なポインタだからね、この時点で。
103 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 08:43:02 ] そもそもなんでnewしたいんだ? そこから見直すべきだな。
104 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 08:44:01 ] >>102 試して落ちたの? 中身へのアクセスは無いからそこじゃ落ちないと思うけど。俺は試してないw
105 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 08:49:34 ] 遅れてすみません >>80 それはまずいですかね? 別の名前に変えてみます >>81 言葉が足りませんでした、すみません まさにその通りです
106 名前:デフォルトの名無しさん [2008/08/10(日) 08:52:57 ] >>104 そうかもね 「動かしてない」って書いたジャン・・
107 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 09:05:21 ] 規格的に、どこを指してるかわからないポインタに"*"を適用した時点で、鼻から悪魔が出るかもしれない、はず。 実装的にも、大抵は「どこを指してるかわからないポインタ変数の指すアドレス」をコピーして別の変数に保持するだけだろうから HDDをフォーマットしてスパムメールを送りまくってももおかしくない、はず。
108 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 09:56:02 ] >HDDをフォーマットしてスパムメールを送りまくってももおかしくない、はず。 おかしいと思います。文章が。
109 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 11:53:58 ] いいもも〜
110 名前:デフォルトの名無しさん [2008/08/10(日) 11:57:43 ] >>109 中学生の太もも?? いいももだよねーーー ハァハァハァハァハァハァハァ
111 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 12:46:00 ] mapに関する質問です。以下のようなプログラムをビルドした際に、 (1)または(2)のように記述するとエラーとなりました。 error C2662: 'MYTYPE::hoge' : 'const MYTYPE' から'MYTYPE &' へ 'this' ポインタを変換できません なぜ(1)(2)だと失敗するのか、(3)だと成功するのか教えていただけないでしょうか。 ※環境 WindowsVista, Visual C++ 2008 Express map<string, vector<MYTYPE> > mapA; for(map<string, vector<MYTYPE> >::const_iterator it = mapA.begin(); it != mapPitcher.end(); ++it) { // イテレータを用いた方法 for(vector<MYTYPE>::const_iterator it2 = it->second.begin(); it2 != it->second.end(); ++itv) { it2->hoge(); // (1)コンパイルエラー } // イテレータを用いない方法 for(vector<MYTYPE>::size_type size = 0; size != it->second.size(); ++size) { it->second[size].hoge(); // (2)コンパイルエラー mapA[it->first][size].hoge(); // (3)成功 } }
112 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 12:57:20 ] >>111 MYTYPE::hogeがconstでないから、const MYTYPEに対してhogeを呼べない。 試しに↓やってみ。 const MYTYPE x; x.hoge(); ↓のようにhogeにconstを付ければok。 struct MYTYPE { void hoge() const; }; void MYTYPE::hoge() const { ... }
113 名前:111 mailto:sage [2008/08/10(日) 13:36:10 ] >>112 ありがとうございます。関数にconstをつけることで(1)(2)ともにコンパイルに成功することができました。ただ、 >const MYTYPE x; のように、変数宣言の時にconstをつけた場合に >void hoge() cosnt; とすればよいと自分なりに解釈したのですが、変数宣言は上で書いたとおり map<string, vector<MYTYPE> > mapA; とMYTYPEにconstをつけていません。どこでconstがついたのか教えていただけないでしょうか。 たびたびで申し訳ありませんが、よろしくお願いします。
114 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 13:46:47 ] const_iteratorだからじゃね
115 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 14:25:37 ] >>113 >どこでconstがついたのか 根本的に勘違いしてる。オブジェクトがconstかどうかと、 メンバ関数のconst指定は、まったく無関係ではないが 基本的に別物
116 名前:111 mailto:sage [2008/08/10(日) 14:27:47 ] >>114 const_iterator → iterator とすると、エラーになりませんでした。 イテレータについてまだ理解していないので、勉強したいと思います。 ありがとうございました。
117 名前:111 mailto:sage [2008/08/10(日) 14:34:27 ] >>115 >>113 の解釈は間違っているということですね。 オブジェクトのconstとメンバ関数のconst指定について調べていきたいと思います。 ご指摘、ありがとうございます。
118 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 14:40:31 ] わざわざconst_iteratorを使ってるからには、constになることくらいわかってるんだと思ってた 世の中難しいものだ
119 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 14:44:38 ] >>118 イテレータについての理解があまりなく、参考書丸写ししてました。
120 名前:デフォルトの名無しさん [2008/08/10(日) 17:12:14 ] C言語の標準ライブラリ関数qsortについての質問です この関数はメモリ上で連続していない配列に対しても動作は保証されているんでしょうか?
121 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 17:16:50 ] >>120 各要素は連続している必要があります。
122 名前:120 mailto:sage [2008/08/10(日) 17:27:06 ] >>121 そうでしたか。 回答ありがとうございました。
123 名前:120 mailto:sage [2008/08/10(日) 17:32:00 ] よく考えたら連続していない配列って・・・。 お恥ずかしい限りです。
124 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 19:07:36 ] ttp://www.rupan.net/uploader/download/1218362175.cpp ttp://www.rupan.net/uploader/download/1218362441.h ttp://www.rupan.net/uploader/download/1218362315.cpp 上から、main.cpp,sample.h,sample.cpp です。すべて同じディレクトリに配置されています。 staticメンバ変数についての質問なのですが、上のファイルのように ヘダファイル内のクラスでstatic変数dataを宣言し、同名cppファイル内で定義しようとすると、 main.cppで「Error: 外部シンボル 'Sample::data' が未解決」と出てしまいます。 int Sample::data = 0; の記述をヘッダファイル内に移動させればコンパイル通りますが、 解説しているサイトなどを見る限り、これは良くない書き方のような気がします。 どこに問題があるのか、ご教授ください。
125 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 19:11:02 ] 少しスレ違いかもしれませんが、VC++で作った実行ファイルについての質問です。 リリースビルドした実行ファイルを覗くと、pdbファイルへのパスがそのまま残っているのですが、 これは他の数、例えば0x00等で塗りつぶしてしまってもいいのでしょうか? 問題なく動いているように見えますが、異常終了した際になにか不具合がでたりしませんか?
126 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 19:12:35 ] >124 失礼しました、コンパイラはBorland C++ 5.5.1です。
127 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 19:25:40 ] >>124 >>126 BCCなら、多分Makefileの問題じゃないかね? コンパイルするときに分割コンパイルするオプション付いてる? -oか何かだと思うけど。
128 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 19:27:39 ] ごめん。大嘘コイた。 多分-c
129 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 19:38:36 ] >127-128 ありがとうございます!ご指摘のとおりでした。
130 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 20:31:47 ] >>125 そんな面倒なことしなくてもコンパイラオプションで消せる。
131 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 21:29:52 ] >>130 ありがとうございます。 なんでデフォでリリースビルドにデバッグ情報埋め込んでるのやら……
132 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 21:35:02 ] 以下のようにvoid*型にポインタを変換したとき、 delete時にデストラクタが呼ばれるでしょうか? class test { int *p; public: test(){ p = new int(); } ~test(){ delete p; } }; int main() { void *ptr = (void*)(new test()); delete ptr; return 0; }
133 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 21:41:28 ] >>132 鼻から悪魔。
134 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 21:42:01 ] _
135 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 21:49:05 ] >>132 delete p; の上にprintfを入れて試してみては?
136 名前:132 mailto:sage [2008/08/10(日) 21:58:43 ] >>135 試してみた。呼ばれないみたいだね。
137 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 22:13:19 ] そりゃvoid*で型情報消してるし
138 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 22:15:03 ] じゃあどうしてvoid*型の変数をdelete/delete[]しようとするとエラーが出るようにはならないんですか? new void;とかできませんよね?なぜ?どうして?
139 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 22:20:42 ] >>131 リリース版でもデバッグできるって結構便利だと俺は思う。 >>138 エラーにしたいという要望だけはboost::checked_delete使えば叶う。 あと、boost::shared_ptr<void>だとデストラクタが呼ばれるというマジックもある。
140 名前:135 mailto:sage [2008/08/10(日) 22:28:54 ] >>138 gccならwarning deleting void* is undefinedって警告がでた。
141 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 23:59:16 ] >>73 なんだけど gccで構造体を = {0} して初期化すると、「最初以外の、他の中身の初期化子(?)がない」っていう警告が出るんだけど、 これは無視してもいいの?
142 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 00:01:16 ] それ構造体か?構造体の配列とかでやってないか?
143 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 00:15:36 ] 構造体です。例えば具体的に言うと、struct tm(mktimeとかで使う、time_tを要素毎に分けた奴)で、 struct tm a = {0}; ってすると、 *.cpp:36: warning: missing initializer for member `tm::tm_min' *.cpp:36: warning: missing initializer for member `tm::tm_hour' *.cpp:36: warning: missing initializer for member `tm::tm_mday' *.cpp:36: warning: missing initializer for member `tm::tm_mon' *.cpp:36: warning: missing initializer for member `tm::tm_year' *.cpp:36: warning: missing initializer for member `tm::tm_wday' *.cpp:36: warning: missing initializer for member `tm::tm_yday' *.cpp:36: warning: missing initializer for member `tm::tm_isdst' って出ます。(最初のtm::tm_secだけ警告が出ない) コンパイル時の設定は -Wall -W ってやってるんだけど、問題ないんだったら、これだけ警告でないようにできないかな…
144 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 00:32:29 ] なら struct tm a = {0, 0, 0, 0, 0, 0, 0, 0, 0}; にすると出なくなるような気がしないでもない。
145 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 10:02:02 ] テンプレートの引数にoffsetofを使いたいのですが、 offsetに使用するパラメータがprivate内にあると エラーがでてしまいます。 なんとかメンバをprivateにしたいのですが、 手は無いでしょうか。 template <int T> class test { }; class Hoge1 { friend test<offsetof(Hoge1, Hoge1::a)>; public: private: int a; }; 以下の様にするとエラー無し。 template <int T> class test { }; class Hoge1 { public: int a; }; test<offsetof(Hoge1, Hoge1::a)>; よろしくお願いいたします
146 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 10:09:31 ] >>145 そもそもクラス(非PODか?)では、変数が宣言順に配置されるという保証がなかったと思う。 危険コードかもよ。
147 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 10:15:39 ] >>146 こらこら クラスは変数が宣言順に配置されるぞ メンバ関数だけは別扱いだけど メンバ関数ポインタも宣言順に配置される
148 名前:デフォルトの名無しさん [2008/08/11(月) 10:20:49 ] >>145 そのコードの目的が分からん offsetofを使わずに済むコードを考えた方がいいんじゃない 見てていらつくコードなんだけど
149 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 10:23:11 ] C++でクラス内でoffsetofを使うのは大抵委譲を使う場合だな
150 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 10:35:42 ] else if{ } と else{ if{ } } とで内部的に違いありますか? 見た目的にネストは浅くした方がいいのかな?
151 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 10:36:40 ] >>150 前者はelseの後に複文が書けない 後者は複文が書ける それ以外は同じ
152 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 10:40:10 ] >>147 非PODだと「変数が宣言順に配置されるという保証がない」ではなくて、 「offsetofマクロが正常動作する保証がない」だった。 (自分は規格を読んでないから↓の受け売りだけど) ttp://www.kijineko.co.jp/tech/cppemb/alignment.html まあ145のコード通りならPODだから問題なさそうだけど、 いつPODでなくなるか分からないから怖いな。