1 名前:デフォルトの名無しさん [2007/06/25(月) 12:01:46 ] エスケープシーケンスやWin32APIなどの環境依存な物でもOK。 ただしその場合、質問者は必ず、環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.38【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1180877635/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
231 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 22:06:12 ] 違うよ?
232 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 22:14:24 ] >>231 230でないけど何が違うか教えてください
233 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 00:58:49 ] >ということだな。 違うよ?
234 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 04:16:48 ] 「処理系のために」ではないだろ。
235 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 07:22:32 ] ハード的なクリックでは無くソフト側で移動・クリック・入力の繰り返しをさせるプログラムを作りたいのですが MSDNの見方がよく分からなくてmouse_eventを使うかもしれないという程度しかわかりませんでした・・・ 使えるAPI・サンプルなどがあったら教えてください よろしくお願いします
236 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 08:39:51 ] SendInput
237 名前:デフォルトの名無しさん [2007/06/30(土) 09:01:14 ] 質問です!! C言語のボーランドでコンパイルしたら元のメモ帳と、コンパイル後のファイルとって感じでいくつか手元にファイルできますよね。 そのとき作ったメモ帳が消えてしまったのですが(プログラムの実行はできる状態)。 コンパイル後のファイルからもとのメモ帳ってもう見ることができないのでしょうか・・・? わかる方よろしくお願いします。
238 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 09:02:16 ] メモ帳って何だ?
239 名前:デフォルトの名無しさん [2007/06/30(土) 09:03:12 ] んと、メモ帳にmainやらintやら打ち込んで、ボーランドでコンパイルしてコマンドプロンプトで実行って形でやってます。 そのとき書き込んだメモ帳です。
240 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 09:11:39 ] 先ず最初に、「メモ(すなわちファイル)」と「メモ帳(アプリ)」を区別するところからはじめる必要がありそうだ。 で、あんたはその「メモ」をなんて名前で保存したんだ? そいつはコマンドプロンプトでdirしても見えないのかい?
241 名前:デフォルトの名無しさん [2007/06/30(土) 09:15:54 ] dir でも見えないし、元の場所からは特に動かしてないので・・・ お恥ずかしながら消しちゃったみたいなんです・・・・ コンパイルの逆、みたいなことってできないのでしょうか?
242 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 09:22:53 ] >>241 それは無理。
243 名前:デフォルトの名無しさん [2007/06/30(土) 09:23:43 ] う・・・・orz ありがとうございました。
244 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:32:14 ] >>234 >17.4.3.1.2 >Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace. implementationだから処理系でいいんじゃない? JISの方も処理系て訳されてるし。
245 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:37:12 ] 一応逆コンパイラはあるけど、 元のコードがそのまま出てくるわけじゃないからなあ。
246 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:46:10 ] デコンパイラでぐぐれ
247 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 18:46:38 ] スレッドで、複数の引数を受け取りたいとき、 std::vector<std::string>で渡したいと思ってます。 //スレッド関数 void Thread(void* vector){ std::vector<std::string> *vec=(std::vector<std::string>*)vector; //エラーでません。正しい? vec->clear(); //コンパイルできても、例外がどうのと出て止まります。vec.clear()のつもりです printf("%d",*vec[0].c_str()); //これだめです } ○vectorの関数push_buck(),insert(),clear()など、使用したり、 vec[0]、、、の中の値が知りたいのですが、方法ありますでしょうか。 ○vec.clear()とかしたいので、左辺にvecのままにして、いろいろ試しました。 std::vector<std::string> vec=(std::vector<std::string>)vector; これは、コンパイルできませんでした。右辺がおかしいみたいです。どうすれば。。。 ---------------------------------------------------------------- ○構造体の場合: vectorがstd::vectorではなく、自分で作った構造体の場合は、 Data *data = (Data *)vector; data->hoge; の要領で、できました。 よろしくお願いします。
248 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 18:53:01 ] >>247 たぶんスレッドに引数渡してるところがおかしい。
249 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 18:54:17 ] >>247 ・C言語の形式のキャストではなく、C++のキャストを使ったほうがいい。 ・コール元からThread()に渡したstd::vector<std::string>オブジェクトの寿命は大丈夫? ・vec[0]を見たいなら、std::cout << vec[0]; で良いんじゃない?
250 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 19:08:19 ] >>248 複数渡したいとき、構造体か配列などなどとあったので。。。 正直よくわからないです。すみません。 >>249 ・C++のキャスト検索してみます。 ・std::vector<std::string>オブジェクトの寿命ですか、 良く、無いものを参照して、プログラム止まります。 同じ症状なので、これかもしれません! ・vec[0]で、大丈夫ですか。了解しました。 ありがとうございました。
251 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 19:54:57 ] >>250 >>249 が指摘してるが、多分スタック上に確保したvectorのアドレスそのまま 渡してるだろ。それじゃクラッシュするのは当たり前だ。
252 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 19:56:01 ] >>250 ごめん、まちがえた。 × vec[0] ○ (*vec)[0]
253 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 20:32:10 ] //void* のポインタキャスト行ったりきたり実験 std::vector<std::string> vec2; vec2.push_back("hoge" ); void *vo=(void *)&vec2; //void*型、準備OK //ここから、スレッドの関数で受け取ってから、std::vector<std::string>に戻す。 std::vector<std::string> *vec=(std::vector<std::string> *)vo;//キャストしました。 std::vector<std::string> vec3=*vec; cout << vec3[0].c_str()<< endl; cout << (*vec)[0].c_str()<< endl;//おまけ。std::vector<std::string>にしなくても、これでもいい。 これは、正常に動きました。キャストの仕方とか大丈夫みたいなので、 参照しようと思ったデータが無いみたいです。 >>251 >多分スタック上に確保したvectorのアドレスそのまま >渡してるだろ。それじゃクラッシュするのは当たり前だ。 スタック?検索すると、 ”処理中のデータや戻りアドレスなどを一時的に退避する場合に使うことが多い” ってありました。 vectorは使用しなくなると自動的に、 開放しちゃうっていう、あれのことでよかったでしょうか?
254 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 20:38:10 ] なぜ新訂版More Effcitive C++の訳本は糞なのでしょうか?
255 名前:247 mailto:sage [2007/06/30(土) 20:39:16 ] vector、map、pairなど、いろいろあると思いますが、 こういうの使いたいときは、どうすればよいでしょうか? 自動で開放してくれなくても、いいので 構造体使うのが、わかりやすいですか。
256 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 20:42:28 ] >>253 > vectorは使用しなくなると自動的に、 > 開放しちゃうっていう、あれのことでよかったでしょうか? ほんとに意味を分かって言ってる? Javaなどのガベージコレクションと勘違いしないか? ここで問題にしてるのは、C/C++で関数(またはブロック)内で宣言した変数は その関数(またはブロック)を抜けると破棄されるということ。 いつの間にか勝手に消えるわけじゃない。
257 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 20:51:30 ] 使用しなくなったら開放、って理解でいいと思うよ。 考えるな感じるんだ。
258 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 20:57:05 ] >>255 vector, map, pairなどはそれぞれ特徴が異なる。 データ同士の意味的なつながりとか、検索/更新の方法や性能など。 複雑なデータの管理をするときに、その使用方法にあったデータ構造を選択すればいい。 単にいくつかの型が異なるデータをひとまとめにして扱いたいだけなら 構造体でいい。
259 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 20:57:17 ] あぁ〜ん!感じちゃう♪
260 名前:247 mailto:sage [2007/06/30(土) 21:12:13 ] >>256 詳しい解説ありがとうございます。 >>257 どもです。^^ >>259
261 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 03:24:35 ] 何を突っ込もうとしてたんだ、>290にw
262 名前:247 mailto:sage [2007/07/01(日) 06:54:52 ] >>258 255って、自分でした。 構造体でよかったですか。ありがとうございます。
263 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:16:49 ] template<class T> inline void ZeroMem(T& dest) { memset(&dest, 0x00, sizeof(T)); }; っていうのを作ったんですがこれって危険でしょうか?
264 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:18:02 ] めっちゃ危険
265 名前:263 mailto:sage [2007/07/01(日) 10:19:58 ] 用途はwinapiで使う構造体の初期化です 一応実際のものは、POD以外渡すとコンパイルエラーになるようにboost::type_traitsとか作って 細工してあります
266 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:30:09 ] >>265 クラスの中に、newなどで確保済みポインタがあったらどうするんだい?
267 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:36:33 ] それはそういうのを渡さないように気をつけるとしか。。。 でもそんな事いったらmemsetも使えませんし MSG msg; msg.hwnd = 0; msg.wParam = 0; とか打っていくのが面倒なんで考えたので 初期化済みかどうかを判別する方法があればいいのですが
268 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:39:35 ] >>267 MSG msg = {0}; // 全部 0 で初期化 msg = MSG(); // 全部 0 を代入
269 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:42:44 ] そういう手があったんですね、トンクスです
270 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:44:03 ] 何がトンクスど、トランクスか
271 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:44:04 ] こんなことも知らない奴がboost::type_traitsとか使ってんの蚊 釣りかと思った
272 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:56:34 ] 一年ほど前に使った記憶はありますが boostやpstadeと格闘している間、 構造体の初期化なんて殆ど使わなかったので忘れていました ま、実質知らないのと同じですね^^^;
273 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 10:58:34 ] ^^^何だこれは3つ目小僧か
274 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:48:20 ] どうしてC++にはコンストラクタとデストラクタがあって デコンストラクタはないのなぜ?
275 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:53:36 ] >>274 デコンストラクタって何ですか?デストラクタと同じものではないですか?
276 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:53:41 ] Con structor De structor
277 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:53:49 ] con-struct-erとde-struct-erだから 説明になっていないけど
278 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:53:51 ] デコンストラクタ = デストラクタ って考えちゃダメなの? 名前が違うだけやん
279 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:55:19 ] 15秒で4レスついてるw
280 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:00:42 ] すみません int a[] = new int[10]; int *b = new int[10]; みたいに確保したときって delete a; delete a[]; delete b; delete b[]; それぞれ解放の仕方で動作おかしくなりますか?
281 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:06:03 ] delete a; アウト delete a[]; アウト delete b; アウト delete b[]; アウト
282 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:08:16 ] これもアウトだ。 int a[] = new int[10];
283 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:08:56 ] >>275 デコンストラクタは脱構築です ただの破壊ではありません ポストモダンなのです たぶん
284 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:09:01 ] >>274 「デコンストラクタ」はただの誤用だろ。 と思ったらこんなところにも。 msdn2.microsoft.com/ja-jp/library/sxbac7x8 (vs.80).aspx 原文はちゃんと destructor なのにね。 msdn2.microsoft.com/en-us/library/sxbac7x8 (vs.80).aspx いちおう deconstruct という言葉も存在するらしい。 ja.wikipedia.org/wiki/%E8%84%B1%E6%A7%8B%E7%AF%89
285 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:09:57 ] >>280 自分で試してから聞けよカス
286 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:38:11 ] >>285 それは禁句だよ。 new[]してdeleteのような正しくないのに環境によっては動くものを 正しい方法だと思ってしまう可能性がある。
287 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:40:29 ] 配列のnew deleteは T* v = new T[n]; delete [] v; でおkなはず
288 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:46:31 ] いやここでstd::vectorとか言い出してやる。
289 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:48:11 ] valarrayの事も時々でいいから思い出してあげてください
290 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:49:43 ] >>286 今回はそれ以前の話。コンパイルできないのがダメ。
291 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 13:50:45 ] shared_arrayでいいんジャマイカ
292 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:00:49 ] いつものパターン: 書く → ビルド → エラーの数が100を超え(ry → (´・ω・`) → 少しずつ直していく → コンパイラ通過 → \(^o^)/ →実行時エラー → /(^o^)\ナンテコッタイ
293 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:03:35 ] delete b; は正常に動作する。 今回に限ってはメモリリークを起こさない。 ただ、b[1]〜b[9]のデストラクタが呼び出されないので、 プリミティブ型以外では動作保証ができない。 いかなる場合においても、new[]で確保したら、かならずdelete[]で解放すること。 だったっけ?
294 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:10:41 ] >>291 たまにはscoped_arrayのことも思い出してあげてください……。
295 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:15:44 ] >>293 いや違う。 未定義動作でFA。
296 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:29:41 ] >>293 デストラクタがあったらメモリの開放に失敗して落ちる環境がほとんど。
297 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:33:54 ] delete bで開放するのいいけど その後メモリ取ろうdeleteした近辺にnewなんかされると 悲惨なことになるぞw
298 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:35:24 ] >delete bで開放するのいいけど 良くない
299 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:39:20 ] 言語的にだめなのは分かるんだけど PODの場合で new[]で確保したのをdeleteでシメた場合に 実際に不具合があるような実装って おおいの?
300 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:39:43 ] 結論としては色々とややこしいから最初は配列なんか使わずにコンテナつかっとけってこと?
301 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:41:50 ] >>300 でも const char *bad_words[] = { "fxxk", "pxxsy", "axxl", "cxxt", ... }; みたいなのは配列が便利じゃね?
302 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:42:36 ] >>299 すくないとか言ったら使いそうだから言わない。
303 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:43:38 ] >>302 いや、実は見たこと無いから聞いてみたんだけど(ボソッ)
304 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:45:28 ] 見たことないけど、 将来デバッグモードで変なことするコンパイラが 出てくる可能性もなくはないと思う。
305 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:46:14 ] >>299 それは実装に不具合があるわけじゃねーぞ。
306 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:47:44 ] >>305 落ちるとかバグるとかそういう環境は多かったりするのか? という話なわけで。
307 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:48:13 ] >>305 いや勿論そういう意味じゃなくて、 メモリが解放されなかったり ヒープが壊れたり 無限ループに陥ったり ハードディスクが初期化されたり といった問題が生じるかどうか、という意味
308 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:51:56 ] >>301 new[]で確保するのでなければ別に構わないと思う。
309 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:56:57 ] >>307 そんな問題が生じたこともないし生じるようにも思わないが生じる可能性はある。
310 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:10:03 ] int a[] = new int[10]; 何が問題なの?
311 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:12:32 ] そもそもコンパイラ通らないだろ
312 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:12:34 ] >>310 コンパイルエラー
313 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:13:58 ] まずコンパイルしてからなんか家w
314 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:15:37 ] int a[] =(int[]) new int[10];
315 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:21:46 ] C、C++の基本的なことは勉強してきました。 それで簡単なGUIアプリから作ってみたいのですがVisual C++とDelphiで迷っています。 DelphiだとPascalを勉強しなければいけないそうですが大変でしょうか? C、C++が無駄になりそうで怖いですが。 C++を勉強してきた場合、Visual C++のほうがいいでしょうか?
316 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:21:52 ] コンパイルエラー
317 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:23:32 ] >>315 C/C++ 勉強したなら VC++ 使えば?
318 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:26:37 ] そしてうっかりCLRアプリケーションのプロジェクトを選択して C++/CLIを勉強する羽目に。
319 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:27:10 ] >>315 どれくらいのレベルか知らないが、勉強のためVC++をススメておく DelphiでもCやC++で勉強してきた基礎は無駄にならないと思うけどね
320 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:27:41 ] Delphi には将来性が・・・
321 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:29:13 ] int *a[] = new int[10];
322 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:29:48 ] int *a[|] = new int[00];
323 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:32:27 ] int **a = new int*[10] for( int i = 0; i < 10; ++i ) a[i] = new int; for( int i = 0; i < 10; ++i ) delete a[i]; delete [] a;
324 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:33:57 ] int (*a)[10] = new int[10][10]; delete[] a;
325 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:35:19 ] delete[] you;
326 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:40:56 ] Segmentation fault (core dumped)
327 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:52:25 ] std::vector<int> a(10);
328 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:53:19 ] std::vector<inpo> you(10);
329 名前:デフォルトの名無しさん [2007/07/01(日) 17:10:26 ] struct A { int x; };みたいなのをA a;と宣言してこれを std::cout << a;のようにした時にメンバであるxの値を出力するように変換関数を定義したいんですが どうすれば良いんでしょう? operator std::string();とやってみましたが変換できないようです
330 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 17:16:12 ] >>329 operator << (std::ostream&, A const&)
331 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 17:16:22 ] std::ostream& operator<<(std::ostream& os, A& a) { os << a.x; return a; } A内で上の関数をfriend宣言しておく