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
331 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 17:16:22 ] std::ostream& operator<<(std::ostream& os, A& a) { os << a.x; return a; } A内で上の関数をfriend宣言しておく
332 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 17:17:31 ] >>331 friend は要らんだろ
333 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 17:20:35 ] >>329 cout << static_cast<std::string>(a); とやるか、 std::ostream& operator<<(std::ostream& os, const A& a) { return os << a.x; } でも定義汁
334 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 17:28:57 ] 皆様の回答を参考にぐぐったら出てきました ttp://www.higlab.k.dendai.ac.jp/~numata/index.php?C%2B%2B%A5%E1%A5%E2#w5403b76 なるほどオーバーロードとfriendの複合技ですか、さらにostreamを戻す事で連結も可能と… かなり使えそうな方法ですね、助言ありがとうございました!
335 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 17:40:54 ] >>334 ここまで必要になるか分からないけど、 class A { public: virtual void print(std::ostream &os); }; std::ostream& operator<<(std::ostream& os, const A& a) { a.print(os); return os; } とやった方が、もしかしたらいいかもしれない。 こうすると継承クラスでprintを再定義できる。
336 名前:334 mailto:sage [2007/07/01(日) 18:02:45 ] >>335 なるほど継承ですか、実行時の多態性については意識し取りませんでした 確かにこの振る舞いをもたせたいのがAだけに限るわけではないですしね とりあえず参考にしてNVI使ってこうやってみました // 構造体A周辺の定義 struct Base { public: void print(std::ostream& os) const { _print(os); } private: virtual void _print(std::ostream& os) const =0; }; struct A : public Base { private: void _print (std::ostream& os) const { os << x; } public: int x; }; std::ostream& operator<<(std::ostream& os, const Base & base) { base.print(os); return os; } // 使用例 #include <iostream> int main() { A a; a.x = 1; std::cout << a; } …しかし鶏を捌くのに牛刀をなんとやらですね 実際に使うとなればここまでする必要も出てきそうな気もせんでも無いですが
337 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:27:37 ] この場合のNVIって何の意味があるの・・・?
338 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:29:47 ] 最近おぼえて使いたくなったんだろ。気にするな。
339 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:35:35 ] NVI ってなんですか?
340 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:40:11 ] >>339 ググレカス
341 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:49:35 ] NVI=non virtual interface のこと。つまり↓ struct Hoge { void hage(T1 arg1, T2 arg2) {_hage(arg1, arg2); } protected: virtual void _hage(T1 arg1, T2 arg2) = 0; }; 下位クラスには_hageを継承してもらう。 なぜこんなことをするのか) 公開仮想インターインターフェイスが果たす目的は以下の二つ(と言われてる^^) 1. 使う人に使い方(インターフェイス)を提供する 2. 派生クラスに「こういうふうにメソッドを継承して下さい」とカスタマイズの規約を提供している たとえば、NVIを使わず下位クラスがhageをそのまま継承してしまうと Hoge#_hageのインターフェイスを変更したときに下位クラスすべてのメソッドを書き直す必要があるんだけど、 もしNVIを採用していればそういうことにはならない。 逆にインターフェイスを変更せず、実装メソッドの方だけを変更することもできる。 >>336 の場合、インターフェイスが変更される可能性は全く無くて、無駄に複雑にしてるだけだと思う。
342 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:52:31 ] そもそも値型のクラスの継承はあまり宜しくない
343 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:54:58 ] 値型のクラス???
344 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:11:16 ] Value classの事 ・publicなデストラクタとコピーコンストラクタと代入演算子を持ち ・デストラクタを含め仮想関数を持たなくて ・具象クラスであり抽象クラスでない ・スタック上や他のクラスのメンバとしてインスタンス化される とまぁおおよそ組み込み型のように振舞えるものでこういうのは継承じゃなくて委譲を使うべきらしいけど、 実際のところはそれが妥当なのか場合によるからよくわかんねけど 俺は複雑な構造体を継承してえらい目にあったので「あまり宜しくない」と思うようになった ちなみに出展はmore effective C++あたりだったと思う
345 名前:341 mailto:sage [2007/07/01(日) 19:23:42 ] >>344 Value classなんて初めて知った。 全部が全部ってわけじゃないけど、ほとんどは>>344 のいうとおりだろうね。 ただ、サンプルプログラムでそういうことを考えちゃうと バーチャルなデストラクタや、privateなoperator =を書く必要が出てきて 全体的に焦点がぼやけてしまいまふ。 >>341 ではとりあえずそういうことは無視させてもらいますた^^
346 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:29:32 ] >>344 そんな区別意味無いだろ。 public なデストラクタが virtual じゃないクラスを継承したのが間違いだったんじゃないの? value class って用語も検索結果が日本語ページ多すぎで胡散臭いし。
347 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:00:20 ] 値のセマンティクスを持つクラスと言いたいのでは? ググったらこんなページを見付けたが、こういう話だろう。 www.ogis-ri.co.jp/otc/hiroba/technical/CppDesignNote/
348 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:09:43 ] つうかそういうクラスはそもそも継承を前提に作ってないだろ 他言語ならsealedクラスになってるタイプのクラス
349 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:29:11 ] で>>342 に戻ると 良いサンプルってやっぱ難しいんだね
350 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:33:35 ] 複雑なものを扱うためのテクニックを簡単なサンプルで見せても 無意味にしか見えんからのう
351 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 22:17:49 ] とりあえず、NVIならこの程度のサンプルでも十分通用するね
352 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 22:18:38 ] NVIってExceptional C++で勉強しましたか?
353 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 22:22:03 ] Exceptional C++―47のクイズ形式によるプログラム問題と解法 Exceptional C++ Style―40のクイズ形式によるプログラム問題と解法=スタイル編 Exceptional C++ Style―40のクイズ形式によるプログラム問題と解法=スタイル編 これって何が違うんでしたっけ?
354 名前:デフォルトの名無しさん [2007/07/02(月) 00:12:21 ] 4バイトint型 num = 10,000,000の16バイト表現を、 ビッグエンディアンで char型 d[10]のd[5]〜d[8]の各要素に格納したいと思っております。 numを表現する4バイトそれぞれの値を取得するためには どうすればいいのでしょうか? char *p = (char *)num; // numのポインタを取得 d[5] = p; // 1Byte分の値を取得 p++; // charのポインタなので1Byte分ポインタを変更 とやることを考えたのですが、pの値がおかしな値になります。 どのようにコーディングするとよいでしょうか?
355 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:14:59 ] char *p = (char*)# の間違いだと思うのだがどうよ
356 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:17:24 ] たびたび、すみません。 スレッドに複数の引数を渡したい者です。 //スレッド関数 void Thread_f(void* StructData){ //何にもしないスレッド StructDataは、下で出てくるData構造体 } メインのほうで、スレッド作成 Data data; //Dataっていう複数の引数を渡すための構造体 for(int i=0;i<n;i++){ data=datalist[i];//datalistは、Data構造体のポインタ配列 代入してから渡してます handle[i] =(HANDLE) _beginthread(CameraThread,0, (void *)&data); Sleep(3000); i++; //スレッド立ち上げてる間に、全部スレッド側で全部datalist[n]になってしまうので。 //ちょっとSleepしました。すごいダメな処理です。すみません。 } n=1のときは、エラーでないです。 nが2より大きいと、動くことは動きますが、×(ウィンドウの閉じるボタン) で閉じると、 -ElnvalidPointerクラスの例外を生成しました。 -'無効なポインタ操作' -プロセスは停止しています。・・・・ というエラーがでます。 ”同じポインタを 2 回破棄したり,すでに破棄したポインタを参照したりすると出る” とネットの掲示板でありました。 同じ関数のスレッドに、それぞれ違うdataを渡したいときは、スレッド関数に引数渡さないほうがいいですか? 248さんが言ってたのは、このことかなぁと思って、今は、引数渡さない方法でやってますが。 上記のプログラムに、手を加えてエラーで無い方法ないでしょうか。
357 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:21:55 ] あっ、CameraThreadは、ほんとの関数名でした。 Thread_fに、訂正お願いします。
358 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:23:23 ] >>356 だから、スタック上のオブジェクトのポインタをスレッド関数に渡すなと。 呼び出し側のコンテキストが平然と進行しつづけてスコープ抜けた瞬間に 無効になっちゃうだろが。 malloc()やnewでフリーストア上にオブジェクトを確保して、その ポインタを渡すんだな。無論渡されたスレッド側で不要になったら 破棄すること。 本当はC++使ってるんなら、スレッドをラップするクラスを作るのが良いが それはまあいい。
359 名前:354 [2007/07/02(月) 00:23:58 ] >355 ご指摘どおりです。 char *p = (char *)# // numのポインタを取得 d[5] = *p; // 1Byte分の値を取得 p++; // charのポインタなので1Byte分ポインタを変更 d[6] = *p; p++; ・・・ としているのですが、値が正常にとれません・・・
360 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:32:53 ] >>358 レスありがとうございます。 new演算子は、Dataをでしょうか? Data *datalist = new Data[N]; これで処理してます。
361 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:34:23 ] >>360 それなら、そのdetalistをそのまんま(void*にキャストして)渡せばいい
362 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:42:56 ] >>361 data=datalist[i]; これを、なくして handle[i] =(HANDLE) _beginthread(CameraThread,0, (void *)&datalist[i]); ということですよね。 これでも、同じ症状です。 dataにコピーしてから、渡すとエラーが消えるかも、 と思って入れたおまじないの処理なんです。
363 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:46:27 ] >>362 ちょっとまて 意味わかんなくなってきた スレッドをN個起動してて、i番目のスレッドにdatalist[i]を渡したいのか だがそれだと、datalist[]の破棄はどうする? いつどこで誰がやってるんだ?
364 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:48:21 ] 今日ここで俺がやる
365 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:55:11 ] メインの方で、スレッドの処理が終わるのを、待ってからです。 スレッドが終わるまで待ちます。 for (int i=n; i>0; i--){ while(WaitForMultipleObjects(n, (CONST HANDLE *)handle,TRUE, 500) == WAIT_TIMEOUT){//タイムアウトなのでループ} } delete data;
366 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:57:35 ] >>365 datalist じゃないのか? delete [] じゃないのか?
367 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:03:11 ] >>365 その i でまわしてる for ループは何のつもり? WaitForMultipleObjects() で全部待つんだろ? あと、戻り値はちゃんとチェックしろよ。 (CONST HANDLE *) とかいうキャストも要らんだろ? っていうか前のコードから要らないキャスト多すぎだ。
368 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:04:02 ] お手数かけてすみません。 delete datalist; です。
369 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:04:48 ] >>365 よくわからんが、メモリバリアを_beginthreadex()の前後あたりに 挿入すると状況が改善されるかも
370 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:05:24 ] >>368 それじゃダメだ。 delete [] 使え。理由は聞かずにちょっと前のログを見ろ。
371 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:27:44 ] while(WaitForMultipleObjects(n, (CONST HANDLE *)handle,TRUE, 500) == WAIT_TIMEOUT){} スレッドが終わったっていう合図以外は、ここでループしてます。 タイムアウト以外というコメント不正確でした。 forで、n回繰り返すと、n個のスレッドが終了するのを待ったことになります。 delete datalist []; deleteの使い方理解していないので、 ちょっと時間掛かるかもです。構文エラーとか出てきます。
372 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:29:11 ] 構わんよ、おつまみみたいでみんな喜んでるみたいだし
373 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:29:40 ] delete [] datalist; ああ、反対でした。 同じエラー出てきました。
374 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:36:17 ] >>371 > forで、n回繰り返すと、n個のスレッドが終了するのを待ったことになります。 WaitForMultipleObjects() の第3引数は BOOL fWaitAll で TRUE の時は その呼び出しで全部待つ。戻り値にはエラーもある。仕様をちゃんと見て使え。
375 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:43:53 ] delete [] datalist; コンパイル通りました。 -ElnvalidPointerクラスの例外を生成しました。 -'無効なポインタ操作' -プロセスは停止しています。・・・・ やっぱり、これが出てきてしまいます。。。 スレッド1個(n=1,N=1)にすると、大丈夫なんですよね。 あと、>>356 で、Sleepの次i++が入ってまずが 頭がおかしくなって、入力してしまったのかもしれません。 すみません。
376 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:47:27 ] 疲れてるなら休めば?スッキリしてないと頭の回転悪いよ
377 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:51:18 ] ぶっちゃけそのレベルで メダパニとラリホーかけられてちゃ どんな間違いやってても不思議じゃないな
378 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 02:02:34 ] >>374 ありがとうございます。 WaitForMultipleObjectsで、苦労したんですが なんか思い出だしてきました。 結局、スレッドの方では、なんにもしてないので、 newで渡すのがだめな気がしてきました。
379 名前:378 mailto:sage [2007/07/02(月) 02:14:02 ] 今日は、ちょっとギブアップします。 ありがとうございました。
380 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 09:25:30 ] >>315 間取ってC++Builder使えばいいんじゃね?
381 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 09:42:53 ] >>332 A内でfriend宣言しておかないとA.aのように参照した場合 もしaがprivateやprotectedだった場合エラーになる。
382 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 09:55:23 ] >>381 この場合はstructで全部publicだから要らんと言われてただけでしょ
383 名前:378 mailto:sage [2007/07/02(月) 10:18:40 ] 378です。 シンプルなプログラムを別に作って、 new演算子でも大丈夫なこと確認しました。 それで、本物の方のプログラムの方をGUIの部品とか 1個ずつはずしていって、シンプルなプログラムに近づけていったところ。。。 (6時間後・・・) void __fastcall TForm1::Button17Click(TObject *Sender) { //なにもしないボタンです。これから実装します。 } ボタン17を削除して、またボタン作ったら なぜか閉じるボタンで、ポインタエラーがでなくなりました。 ということで、new演算子で渡しても大丈夫みたいです。 ありがとうございました。
384 名前:デフォルトの名無しさん [2007/07/02(月) 13:07:16 ] VC7でswitch内で switch (val) { //コメント //コメント case 1: 〜〜 break; } こんな感じでcaseの上に複数コメントがあるブロックが多いと、 デバッグの時のブレークポイントや、実行時の位置が おかしくなることがあるみたいなんですが、どこかに詳細な 報告はありませんか? 検証が甘いですが、VC2005でも同じ現象が起こるみたいです。
385 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 14:12:08 ] int (*a)[] = new int[10];
386 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 17:39:39 ] 質問です。 Foo::Foo() : m1(), m2(), m3() {} このようなFooクラスのコンストラクタにおいてm2のコンストラクタが例外を投げたとき、 既に初期化が完了していたm1のデストラクタが呼ばれることは「C++の規格で保障」されているのでしょうか? VC++2005で確認した限りではその通りの動作をするようですが…
387 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 17:44:42 ] 保証されてる。 Foo::Foo() try : m1(), m2(), m3() { } catch(...) { } みたいにしてキャッチすることもできるけど、 例外は必ず再送出される。
388 名前:386 mailto:sage [2007/07/03(火) 17:51:16 ] >>387 ありがとうございます。 > Foo::Foo() try : m1(), m2(), m3() { } catch(...) { } そういえば function-try block なんて見たのは久々^^;
389 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:04:46 ] コンストラクタが失敗して例外を投げたときって、 中途半端にコンストラクトされた状態だと思うんだけど、 デストラクタは呼ばれないわけだよね? メモリリークの原因にならないのかな?
390 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:07:50 ] if(pMem){ delete pMem; } でおk
391 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:09:32 ] >>389 ちゃんと自分で例外をキャッチして開放してくだちぃ。 それが嫌なら vector とかスマートポインタとか使ってデストラクタに任せてくだちぃ。
392 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:12:42 ] >デストラクタは呼ばれないわけだよね? catchしたら呼べばいいじゃん。
393 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:12:52 ] >>390 deleteはNULL渡したら勝手に無視してくれなかったっけ?
394 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:13:12 ] してくれる。
395 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:13:59 ] 仕様上は無視することになってるが、 昔の VC++ あたりはしてくれなかった記憶がある。
396 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:20:11 ] そうだっけ? もしそうなら、そのときはその仕様がまだなかったんじゃないか
397 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:21:03 ] www.google.com/search?hl=ja&q=directx+if+delete+release&lr=lang_ja なんてググると、DirectXあたりで #define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } こんなマクロが出てきたりするからてっきり勘違いしていた。
398 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:24:56 ] >>396 VC6 あたりまでそうだったと思う。 この仕様があるかどうか微妙な時代かもしれん。
399 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:20:22 ] SAFE_DELETEの利点は変数にぬるぽを代入してくれる点 解放後にアクセスしようとすると素直に落ちてくれる
400 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:28:18 ] ニートで暇だからプログラミングの練習でもするかとゲームを作り始めたのですが いきなり挫折しました。かれこれ4時間ほど睨めっこしてるのですが どこに間違いがあるのか検討つきません。ご教示お願いします。 環境はコンパイラはBoland C++ 5.5 + BolandDeveloper 1.221 WinアプリケーションでDXライブラリです。(多分環境は関係無いんでしょうが) メッセージはint型はchar *型に変換出来ないと出ます。 一部抜粋 FILE *fp; char *file_name="map1.txt",buf[99]; char* p; char* q; if((fp=fopen(file_name,"r"))==NULL)return-1; このぎょうです。→ while((fgets(buf,sizeof(buf),fp))!=EOF){ j=0; p=strtok(buf,","); map_data[i][j]=atoi(p); j++; while(p!=NULL){ p=strtok(NULL,","); if(p!=NULL){ map_data[i][j]=atoi(p); j++; } } i++; } fclose(fp);
401 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:32:58 ] とりあえず、fgetsはEOFなんか返さないってば。
402 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:39:19 ] >>401 ありがとうございます。 ・・・orz 混乱していたから別ファイルで作ったのを コピペ改変していました。 なんでこんなミスばっかりやらかすんだろな・・。俺は。
403 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:39:50 ] だからニートなんだろ
404 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:38:48 ] すみません。mallocって確保したメモリのポインタが返ってくるのですが、 このポインタって確保したメモリのどこを指しているのですか? このポインタ指しているところの規定ってあるのですか?あればどんな規定?
405 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:42:38 ] >>404 最初(0アドレス)を指してる。
406 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:47:07 ] 0アドレスって凄い誤解されそうな・・・。
407 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:49:05 ] char *p = malloc(size); とすれば、 p[0] 〜 p[size - 1] のメモリをアクセスできることが保証され、 p + size が無効なアドレスにならないことが保証されている。
408 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:27:47 ] 何となく思ったことなんですが、 char *s = "hoge"; は char s[] = "hoge"; と違って、中身を書き換えたりしたらダメなんですよね。じゃあ、最初から const char *s = "hoge"; としておいた方が、間違って書き換えちゃったりしたらコンパイル時にエラーになって、 深夜のデバッグ作業突入を防げるような気がするんですが、これはいい考えですか? それとも、気をつければいいだけですか?
409 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:30:13 BE:223773825-2BP(21)] >>408 とてもいい考えアル と、effective c++あたりに書いてあった希ガス
410 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:37:22 ] >>408 char *s = "hoge"; char s2[] = "hage"; s = s2; s[1] = 'i'; constをつけるとこれもできなくなる。やらないと思うけど。
411 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:43:50 ] const char* const s ="hoge"; にすれば s++ とかも防げるぜ! 以下修飾子の位置について終わりのない議論が始まります
412 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:45:27 ] >>408 少なくとも自分は条件反射的にconstつけてる
413 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:46:11 ] 結論出たので終了
414 名前:デフォルトの名無しさん [2007/07/04(水) 01:05:17 ] 今日wstring型ってのを知ったのですが、 wstring a[2]; a[0] = L"あああああ"; a[1] = L"いいいいい"; wcout << a[0] << endl; wcout << a[1] << endl; ってやっても何も出力されません。 なぜでしょうか?教えてください。 ググっても良い資料が見つからない、、、。
415 名前:デフォルトの名無しさん [2007/07/04(水) 01:06:39 ] >>414 です。 ”何も”ではなく空白行が2行出力されます。
416 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:07:36 ] wcout locale imbue でググるんだ!
417 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:23:30 ] string
418 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:25:59 ] 横レスだが、MacOSX GCC 4.0.1 だと locale に何渡しても runtime_error になるな。
419 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:53:39 ] Javaの静的初期化メソッドみたいなもの、C++にありましたっけ? たとえば、 class hoge { static int num[100]; //この配列を0-99まで初期化したい } hoge::int num[100]; といったとき、どう書くのが一番スマートですか? (num[100]={0, 1, 2...} とやるのはなしとして) コンストラクタ内で初期化しようとすると インスタンスを生成するたびに何度も同じ処理が 繰り返されることになるので無駄だし…… 初期化処理が既に終わっているかどうかを示す フラグを追加するとかでしょうか。
420 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:04:49 ] 今考えたけど、こういうゴリ押しができなくもないな。 friend しなくても通ったけど、これって規格的におkなの? #include <iostream> class hoge { private: static const int SIZE = 10; private: struct static_init { static_init() { for(int i = 0; i < SIZE; ++i) { num[i] = i; } } }; public: static void show() { for(int i = 0; i < SIZE; ++i) { std::cout << num[i] << std::endl; } } private: static int num[SIZE]; static static_init static_init_; }; int hoge::num[hoge::SIZE]; hoge::static_init hoge::static_init_; int main() { hoge::show(); }
421 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:17:42 ] この程度で充分じゃね? class hoge { static int num[100]; }; int hoge::num[100]; static int initialize() { for (....) { ... } } static int initializer = initialize(); ファイルスコープのstaticが嫌いならnamespace{}でも。
422 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:24:58 ] 関数を friend にする必要があるね。 個人的には戻り値 int が必要になるのが気持ち悪い。
423 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:36:10 ] >>421 うわー、その手がありましたか。 絶対忘れないように今すぐそれ使って何か書いてきます。 ありがとうございました。
424 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:56:23 ] class CStaticInt { public: CStaticInt(void) { for( int i = 0; i < 100; i++ ) a[i] = 0; } ~CStaticInt(void){} static CStaticInt* GetInst( void ) { static CStaticInt obj; return &obj; } int a[100]; }; こういうのもどう? んで、CStaticInt::GetInst()->a[0]でアクセスする マクロ化すれば使用に耐えられなくも無い…かもしれん('A`)
425 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:45:31 ] scanf("%s",str); if(strcmp(str," ")==0) printf("空白文字"); これで入力された文字が空白かどうか調べようとすると strcmpが0とならずprintfが実行されません。 これってどこがダメなのでしょうか?
426 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:47:49 ] >>425 入力が半角空白1文字じゃないんだろう。 else で puts(str) してみれば?
427 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:02:37 ] >>426 う〜ん、なんか動かしてみると scanfが空白文字を読み込んでないみたいな動作をするというか、 半角空白を入力すると入力が終了せず延々と入力を促すようになるのです。 だからif文の後もelse文も実行されない感じでしょうか。
428 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:11:21 ] %s は空白を飛ばすから当然そうなる。
429 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:16:38 ] >>428 そうなのですかorz では文字列を入力するという処理で空白文字が入力されたか というのを調べるには↓みたいにするしかないですか? fgets(str,N-1,stdin); if(str[0]==' ') printf("空白文字");
430 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:20:54 ] strstr()
431 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:42:00 ] >>429 どういう仕様にしたいのかが今ひとつ分からんから何とも言えんなあ。 " hoge " とか "hoge hoge hoge" とか入力された場合どうしたいのかな?
432 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:08:13 ] >>431 char str[N][N]; int i; for(i=0;i<MAX;i++){ printf("文字列入力:"); fgets(str[i],N-1,stdin); if(str[0]==' ') break; } こんな感じで空白文字が入力されたら入力を打ち切る仕様にしたいのです。 だから"hoge hoge hoge"の場合はそのまま文字列として格納です。 >>430 紛らわしいこと書いてすみません、仕様は上記のような感じでした。
433 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:10:00 ] if(str[i][0]==' ') break; でした。書き間違い。
434 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:12:14 ] >>432 " hoge " はどうなの?
435 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 15:15:03 ] >>434 それは考慮してなかった…。 コマンドラインでの入力が「半角スペース+Enter」の場合のみ 入力を打ち切るという仕様だと思います。
436 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 15:19:33 ] >>435 あと、" hoge " と入力された時、 最初と最後の空白をどうするのかという問題もある。
437 名前:デフォルトの名無しさん [2007/07/04(水) 17:09:55 ] TCHAR buf[100]; cin >> buf; ってすると UNICODE 版でコンパイルするとエラーになるのですが、 cin の TCHAR バージョンってないのでしょうか?
438 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:13:46 ] 自分で作るしかなかったと思う。 #ifdef UNICODE_ wistream& tcin = wcin; #else istream& tcin = cin; #endif
439 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:37:17 ] >>404 から >>407 さんへ、有難うございました。 すいません >>407 の >p + size が無効なアドレスにならないことが保証されている。 これ意味の解らないのですが、p + sizeのアドレスって、 確保されたメモリの次アドレス(確保外)が無効なアドレスにならないてことですよね。 なぜ、確保外の次のアドレスを無効なアドレスにならないことを保証しなければならないのですか?
440 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:46:51 ] ポインタ変数でループする際の終端として使えるようにするため。
441 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:48:26 ] >>439 の訂正 誤:これ意味の解らないのですが、 正:これの理由が解らないのですが、
442 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:55:36 ] >>440 有難うございました。 つまり、これに使うためにってことですね。 for( char* ptr = p; p != ptr; ptr++){} >>407 さんと >>440 さんのおかげで少し賢くこうなりました、ぺこり
443 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 19:15:40 ] それだといきなりループが終わるw C++ やってりゃ分かると思うけど、 algorithm でやってるあーいう処理ね。
444 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 20:59:34 ] あいやー、いきなりループが終わるんですか、ガクブル、どうすれば良いんですか
445 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:01:14 ] こんな感じ #include <stdio.h> #include <stdlib.h> void fill(int *begin, int *end, int first, int step) { int *p; int n = first; for(p = begin; p != end; p++, n += step) { *p = n; } } int sum(int *begin, int *end) { int *p; int n = 0; for(p = begin; p != end; p++) { n += *p; } return n; } #define SIZE 5 int main() { int *p = malloc(sizeof (int) * SIZE); if(p == NULL) { return EXIT_FAILURE; } fill(p, p + SIZE, 0, 1); printf("%d\n", sum(p, p + SIZE)); free(p); }
446 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:05:50 ] c++で全角と半角を格納している配列から一文字ずつ読んで 標準出力させたいんですが、全角の1文字目と半角を区別することができません。 string str = "あイウ()"; for (int i = 0;i<=100;i++) { printf("%c",str[i]); } こうすると半角は正しく出力されますが、半角が出ません。 どうしたらいいですか?
447 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:12:41 ] >>446 色々方法はある。 _mbclenを使うとか、wstringやUNICODEにするとか。
448 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:26:22 ] > 半角は正しく出力されますが、半角が出ません どっちなんだよ?
449 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:32:50 ] >>445 有難うございます、あす、これとmallocの知識を引っさげて学校で自慢してきます
450 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:33:27 ] >>449 他にこのスレ見てるやつもいるかもなw
451 名前:445 mailto:sage [2007/07/04(水) 21:34:47 ] >>447 なるほど。書いてもらったやつで調べてみたら できそうですね。ありがとうございます。 あと少し教えてください。 「_mbclen」のアンダーバーは何を意味しているんですか? それとアンマネージドというのは.NETの機能を 使わなければいいんですよね? MFC、ATL、SDK、WINDOWS APIとかその辺の区別が全く理解できなくて・・・。
452 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:35:45 ] >>448 すいません。「全角が出ません」の間違いです。
453 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:44:47 ] >>451 処理系オリジナルのものと言う証。 下線で始まる名前は、処理系のために予約されている。
454 名前:デフォルトの名無しさん [2007/07/04(水) 21:59:18 ] C++初心者です。型変換のことで教えてください。 main(){ int iv; iv=int(3.14); } この「int()」は何ですか?キャスト演算子ですよね?それとも値生成演算子? また、 class T { int miv; public: T(int iv=0):miv(iv){} }; main(){ T oa; oa=T(2); } このT(2)は、変換コンストラクタの呼び出しですよね?キャストとは呼ばない? さらに、main()を次のように書き換えると、 main(){ T oa; oa=static_cast<T>(2); } このstatic_cast<T>(2)はキャストだけど、実はT(2)と同じですよね。 じゃあ、T(2)もやはりキャストなのでしょうか?コンストラクタの呼び出しとは言わない? ネットやいろんな本を見ても、このあたり、はっきり書いてないのです。
455 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:00:47 ] >>453 わかりました。ありがとうございました。
456 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:06:07 ] >>454 >この「int()」は何ですか?キャスト演算子ですよね?それとも値生成演算子? int のコンストラクタの呼び出しによるテンポラリオブジェクトの作成。 >このT(2)は、変換コンストラクタの呼び出しですよね?キャストとは呼ばない? T のコンストラクタの呼び出しによるテンポラリオブジェクトの作成。 >このstatic_cast<T>(2)はキャストだけど、実はT(2)と同じですよね。 多分同じ。
457 名前:454 mailto:sage [2007/07/04(水) 22:20:46 ] >>456 さん、早速ありがとうございます。 intのようなC言語からある型の場合も、コンストラクタ、オブジェクトという概念で 考えるのですかぁ。C++では、intなどの型もクラスのような感じ? C++本やネットでは、int()は(C風の)キャストだという記述が多いですが、 「コンストラクタ呼び出しによるテンポラリオブジェクトの作成」は、 別な言い方をすれば「キャスト」と同じこと、という理解で良いのでしょうか? static_cast<T>(2)はT(2)と規格上同じだし、(T)2、と書くことも出来るから考えると。
458 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:23:22 ] キャストは引数を複数取れないから基本的には別のもの。 引数が 1 つの場合は同じようになるだけで。
459 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:27:09 ] 規格票の 5.2.3 明示的型変換(関数的記法) によれば、 この記法とキャストは同等だと書いてありますね。
460 名前:454 mailto:sage [2007/07/04(水) 22:40:00 ] 型がクラスの場合は、 引数1つだとキャストと同じ表記だけどキャストとは別もののコンストラクタ呼び出し、 というのは、納得です。 じゃあ、例えばintの場合、Cでは「 (int)3.14」はキャストですよね? C++では、「(int)3.14」はコンストラクタ呼び出しであって、キャストではないということ? それとも、「(int)3.14」はキャストだけど「int(3.14)」はコンストラクタ呼び出し? と、ここで>>459 さんもコメントどうもです。 とすると、意味合いとしてはキャストと、このコンストラクタ呼び出しは同じってこと? それとも、記法としては同じであって、でも意味合いとしては別もの、ということ?
461 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:46:33 ] 同じものの違う表記法というだけみたいですね。
462 名前:デフォルトの名無しさん [2007/07/04(水) 22:47:33 ] >>408 char *s = "hoge"; は、書き換えたりしない(書き換えられないとは違う)。 同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、 コンパイラに特別指定しない限り同じ領域を指すポインタである。 深夜までデバッグしたくなければ書き換えるのはやめれ。 従って、("hoge"[2] == 'g') は、真になる。参照する方はやりたい放題。 関数内での char s[] = "hoge"; はありえないと思うのだが、検証した? char s[]というのはポインタではなく、要素数を省略した配列なので、 まず、要素数が決まる `= { ... }' という構文が必要。 そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。 例えば、static char s[] = { 'h', 'o', 'g', 'e', '\0' }; これなら別の値に自由に変更可。 例外として、引数がある void hogege(char hoge[]); これは void hogege(char *hoge); と全く同義なので自由に書き換えられる。 もちろん、呼び出し元の関数と調和をはかるように。
463 名前:454 mailto:sage [2007/07/04(水) 22:51:48 ] 昨日、本屋で「C++の設計と進化」を立ち読みしたです。 索引で見つけた「コンストラクタの表記」を引いてみると、 クラス型名(式)の表記によってコンストラクタを式中でも使えるようになった、 というようなことが書いてあり、さらには、この表記は、 キャストの表記と同じだ、とも書いてありました。 でも、コンストラクタの表記とキャストは同一だという説明はなく、 このあたりは、はっきりとは書かれていなかったです。 C++の本は、新しい4つのキャスト演算子については必ず説明がありますが、 オブジェクトの初期化とコピーコンストラクター以外の コンストラクタの呼び出し(とテンポラリオブジェクトの作成)については、 ほとんど説明がないですねぇ。。
464 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:57:01 ] 正確な情報を知りたければ規格票を見るのが一番ですよ。 www.jisc.go.jp/app/JPS/JPSO0020.html C++ の規格番号は X3014 です。
465 名前:454 mailto:sage [2007/07/04(水) 23:00:56 ] >>464 はい、逝ってきます・・・
466 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:17:00 ] >>460 459ではあれだけで終わっているが、 実際のところ、5.2.3には続きがあって、括弧の中の式の並びが複数ある場合、 コンストラクタを呼び出して一時オブジェクトを作ると規定されている。 歴史的には、コンストラクタを呼んでクラスの一時オブジェクトを作る構文として 導入されたのが最初で、後にそれを一般化して全ての型に対して使えるようになった。 (C++の設計と進化に書いてあるとおり) その際、組込型では型変換演算子と同じ効力を持たせたという次第。 また、1つしか引数を取らないコンストラクタは、そのクラス型への型変換を提供する。 だから454でのstatic_cast<T>(2)は結局コンストラクタ呼出として機能する。 (あと型変換演算子の話もしたいが省略) C++は、型変換を即ち新しいオブジェクトが作り出されることと捉えているように思われる。 すると、コンストラクタ呼出と型変換の境界が非常に曖昧になっているも納得がいく。
467 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:24:01 ] (int*)p はできるけど int*(p) はできないってところとか、 本当に細かい文法的な違いはあるね。
468 名前:454 mailto:sage [2007/07/04(水) 23:34:42 ] >>466 ちょっと判ったような気になりました。ありがとう。 ついでにもう一つ。これから変換関数、変換演算子を勉強しようとしているところですが、 この2つ、同じものですよね?呼び方が違うだけで。 >>467 そーですね。単一名称(単純名称)でないとだめ、という説明はよく見ます。 typedefすれば大丈夫、ともよく書いてある。
469 名前:454 mailto:sage [2007/07/04(水) 23:49:26 ] いま、JIS3014を検索してみました。 「変換関数」はたくさん出てきます。 「変換演算子」というのは該当無しで、 「型変換演算子」は、dynamic_cast, static_cast, reinterpret_cast, const_cast のことを指すのですね。 ネットでググると、変換関数の意味で「変換演算子」を使っているページが たくさんヒットするんですが、これらはみんな間違ってるのかな。 というか、JIS3014、おもしろい。絶対的な信頼があるから、 間違いを疑う必要もないしね。
470 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:18:30 ] 間違いはないけど、コンパイラが対応してないこともw export とかほとんど対応してないし。
471 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:35:03 ] >>462 初心者騙して楽しいか? > 同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、 > コンパイラに特別指定しない限り同じ領域を指すポインタである。 そんなことは決まってない。 > そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。 自動変数でも配列要素数の省略は使える。
472 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 04:58:00 ] 質問です。 Microsoft Visual C++ 2005 Express Editionにおいて、 C++のアプリケーションを作っています。 コンパイル後の.exeファイルのプロパティで バージョン情報や会社名などが表示されるタブが出ません。 ソリューションエクスプローラ中にはAssemblyInfo.cppという、 AssemblyTitleAttributeなどが配置されたファイルが自動生成されています。 しかし、反映されません。(検索などではC#で作成され、csの場合のみ反映されるらしい) 対処法か代替案を持っていらっしゃる方はおりませんか?
473 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 05:13:07 ] >>472 こっちで聞いた方がいいと思う Visual Studio 2005スレ Part21 pc11.2ch.net/test/read.cgi/tech/1180692040/
474 名前:デフォルトの名無しさん [2007/07/05(木) 09:03:52 ] 実行環境はWindows環境、開発環境はVS6.0です。 メールを送りたいのですが一般的な既存ライブラリは存在しているのでしょうか? イメージしているのはWinsockに依存したライブラリですが 普通はそのままSMTPを喋るものなのでしょうか? 受信は必要なく、OB25Pも問題ありません。
475 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 09:38:14 ] Windowsで一般的といえばMAPIだろうな 俺は使いたくないけどw
476 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 09:42:20 ] basp21.dll
477 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 10:46:02 ] >>476 そういえばそんなのもあったね。
478 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 11:05:27 ] ttp://www.hi-ho.ne.jp/babaq/basp21.html 2007年6月29日更新 タイムリーすぎてワロス まさか自演じゃないだろうな
479 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 11:31:25 ] Windowsで簡単に見た目もいけてるGUIを作るにはどんな方法があるでしょうか? ちなみに過去にチャレンジしたこと ・C++/CLR コントロールは豊富だが、OfficeとかVSにあるようなフローティングメニューが見つからないので中断 日本語の資料が少なくて困る 既存のリソース(DLLなど)と組み合わせるときに DLLのほうの仕様を変えないとうまく動かないor非常にめんどくさいの2択になる あと変な拡張構文がキモい ・MFC デフォルトのコントロール数が貧弱だが、資料も多いし、 Win32APIをラッピングしてある程度のものが多くわかりやすい。 VS2005で作成するとManifestでうんぬんとうざいのでスタティックリンクできないプロジェクトだとだるい。 ・C++Builder GUIのデザインをするには最強だと思うが、本体が生きてるのか死んでるのかよくわからんのと 重い、謎のバグがいつまでも取れない、というのがネック。 未だに6を使ってる人が多い。 VCと一緒に入れるとデバッガが正常に動かない可能性がある? ・WTL 何がいいのかさっぱり
480 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 11:40:11 ] CEGUI
481 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 11:56:50 ] >>479 SWINGとかAWT継承すれば? C++じゃなくなるけど
482 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:21:14 ] SwingとかAWTをJNI通してC++から使うっていう意味?
483 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:22:06 ] SQING や AWT がイケてるとは思えないけどw
484 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:36:44 ] ロジック部分を C++ で書いて ユーザインターフェイスは C# で書く。 C# からアンマネージドなDLL呼び出せるし。 だめ?
485 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:43:30 ] FrameworkもJREも無しですませたい
486 名前:デフォルトの名無しさん [2007/07/05(木) 12:52:35 ] すみません stringのfindは、またはの検索できませんか たとえば"あい"または"大塚"または"愛" とかです
487 名前:デフォルトの名無しさん [2007/07/05(木) 12:53:34 ] str.find("あい"|"大塚"|"愛") でいいんでしょうか
488 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:56:49 ] なんで試さないの?
489 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:58:48 ] >>486-487 str.find("あい") != string::npos || str.find("大塚") != string::npos || str.find("愛") != string::npos 正規表現ライブラリを使ったほうがいいかもね。
490 名前:デフォルトの名無しさん [2007/07/05(木) 13:01:18 ] >>499 ヒットする、またはヒットする、ってやるんですね サンクス わかりました
491 名前:デフォルトの名無しさん [2007/07/05(木) 13:02:37 ] でも、番号がわからないような気が・・正規表現ライブラリを調べてみます!
492 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 13:07:19 ] 場所が欲しかったら代入してやればいい if ((pos = str.find("あい")) != string::npos || (pos = str.find("大塚")) != string::npos || (pos = str.find("愛")) != string::npos) { // みつかった } else { // みつからへん }
493 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 14:22:14 ] ライセンスキーを入力->立ち上がる これをやりたんです。 ・キーの発行は手作業で。 ・アプリ側ですること、ライセンスキーを認証するdllを作成。 こんなこと想像してます。解説しているページや 簡単に実現できるツールなどありませんか。
494 名前:472 mailto:sage [2007/07/05(木) 15:53:44 ] >>473 誘導感謝。そっちへ行ってみます。
495 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:58:22 ] >> 同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、 >> コンパイラに特別指定しない限り同じ領域を指すポインタである。 > >そんなことは決まってない。 そうでない処理系を挙げてくれ。 > >> そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。 > >自動変数でも配列要素数の省略は使える。 どんな例か試しに書いてくれ。
496 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:04:06 ] VCとか。 C89(ANSI-C)以前の人は、自動変数で int hoge[]={1,2,3};式の初期化が出来ないとか言い張ることあるよね。
497 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:08:04 ] >>495 Visual C++では、コンパイラオプション/GFを指定しないと 同一文字列リテラルが同じ領域を共有するようにならない。 (なお/O1や/O2などの最適化オプションを指定すると暗黙の内に/GFも指定されたことになる) ローカル変数での配列でもchar s[] = "hoge";や char s[] = {'h', 'o', 'g', 'e', '\0'};のように書くことは可能。 このように静的変数や大域変数と同じ構文。 少なくともANSI/ISO Cではできることになっているし、 PC用のコンパイラなら今時できないものを見つけるほうが難しい。
498 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:12:14 ] >>495 ===== 同じ文字列リテラルが違う領域を指す例 ===== gcc -c b.c gcc a.c b.o /*----- a.c -----*/ #include<stdio.h> char *p_hello(void); int main(void){ printf("%s %s\n", "hello", p_hello()); printf("%p %p\n", "hello", p_hello()); return 0; } /*----- b.c -----*/ char *p_hello(void){ return "hello"; } ----- 実行結果 ----- hello hello 00403000 00403020 ===== 自動変数で配列要素数の省略 ===== #include<stdio.h> int main(void){ int i, data[]={0,1,2,3,4,5,6,7,8,9}; for(i=0;i<sizeof(data)/sizeof(data[0]);i++) printf("%d\n", data[i]); return 0; }
499 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:22:06 ] >>495 わざわざ無知を晒しに出てこなくてもよかったのにね。
500 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:28:25 ] まあ聞くは一時の恥、聞かぬは一生の恥と言うし、 495はいい勉強になったということでいいじゃないか。
501 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:38:17 ] >>493 至極簡単だと思うけど…
502 名前:474 mailto:sage [2007/07/06(金) 01:01:18 ] 皆様回答ありがとうございます。 BASP21はタイムリーですね。自演ではないです。 調べてみたところSMTP-AUTHに対応してなさそうな感じでしたので MAPIをもう少し調べてみようと思います。 ありがとうございました。
503 名前:493 mailto:sage [2007/07/06(金) 02:01:09 ] >>501 1.大量のライセンスキーのデータベースが入っていて、マッチング。 2.それとも、秘密の値を一つだけ持っていて、 数学的になにか計算して、(ハッシュなど)マッチング。 一番目ってキーの数が多かったら、大変ですよね。ぬー。 ということは、数学のなにかを使って、やるんでしょうか? たとえば、ウィンドウズだと、どんな感じでしょうか。
504 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:25:49 ] ライセンスキーをソートした状態で持っておけば、2分検索が使えるよ。
505 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:45:47 ] だいたいはアルゴリズムで、 ブラックリストデータベースも利用、かなー。 MSのは、公開鍵認証とハッシュがどーの、という話があったけどねー
506 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 06:36:31 ] オンライン認証じゃないのか
507 名前:493 mailto:sage [2007/07/06(金) 10:40:35 ] >>504-505 たくさんの大量のライセンスキーを 用意して、ただマッチングがわかりやすいです。 オンライン認証もいいですね。 >MSのは、公開鍵認証とハッシュがどーの、という話があったけどねー ハッシュ、公開鍵、秘密鍵、独自の計算方法、を使うんですか。 難しそうなので、うまいアルゴリズムは、徐々に考えていこうと思います。 興味があったので、勉強のために質問させていただきました。 ありがとうございました。
508 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 11:17:24 ] MSの場合はデータベースを使ってるに決まってるだろ。
509 名前:495 [2007/07/06(金) 21:41:30 ] 検証してANSI-Cでは動的配列等の初期化ができると分かって来て見たら非難誹謗の嵐だ。 わざわざお礼を言おうと思ったが、そんな非礼な人間に感謝の気持ちなどなくなった。 そうだよ。俺はANSI-C以前からC使いだった。 C++を黎明期から覚えて使い始めてからは、string系クラスが活躍してくれて 外的・静的配列以外に初期化子を使う必要もなかったからな。 君らが古いコードをメンテする憂き目に遭うことを祈ってるよ。
510 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 21:46:42 ] どんな理由があろうが捨て台詞は格好悪いから辞めた方がいいって
511 名前:495 mailto:sage [2007/07/06(金) 21:50:05 ] ああ、ちなみに俺は『夜中までデバッグしたくなかったら』という前提で 文字列リテラルは同じポインタを参照するって意味で書いたんだぜ。 その辺は文脈嫁。 それから、C/C++の教本を読んでる暇があったら職を探せよ(w
512 名前:495 [2007/07/06(金) 21:53:19 ] 漢字もろくに書けないゆとりに説教されるとはな。 辞める→止める、やめる 適当にアラスカ。
513 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 21:56:33 ] なんだこのオッサン 年甲斐もなく2chで火病かよ 一生やってろ
514 名前:デフォルトの名無しさん [2007/07/06(金) 21:58:22 ] 俺をあげつらったやつら、特に学生よ、昔のコードには int a[100] = { 0 }; なんて構文はなかったんだぜ。 就職先のコンパイラが古かったら、解けないバグに悩まされろよ。
515 名前:495 [2007/07/06(金) 21:59:34 ] >>513 そのつもりだぜ?
516 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:00:17 ] 日々のストレスで頭がおかしくなったんだよ。 そっとしといてやれ。
517 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:01:08 ] >>514 古いコンパイラでその構文が通らなければエラーになるだけなので 解けないバグも糞も無いんだが……
518 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:01:08 ] そんなに悔しかったのか
519 名前:495 [2007/07/06(金) 22:03:08 ] そっとしてくれないのはまさに君じゃあないか >>516 火病だろうがなんだろうが、アラシがいると皆楽しそうだなあ。ふふっ 期待してるんじゃないのか?
520 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:03:32 ] こりゃC99の話とかしたらおもしろそうだな
521 名前:495 [2007/07/06(金) 22:07:05 ] >>518 そうだな。例えば君が車の免許を取ったとする。 10年後に、君の知らない新しい規則で捕まったとしよう。 それは悔しくないか? 100歩譲って仕方ないとしても、 見ず知らずの人間から「そんなことも知らんバカがいる」 と言われて悔しくない奴がいるかい?
522 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:08:15 ] 技術者なら仕様の更新くらい把握しとけよ
523 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:10:18 ] この業界の人間ならまず己を恥じるけどな アンテナ張らなくなったら終わりだぞ
524 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:11:59 ] 昔から半導体のプロセス技術で仕事をしていて、 年々プロセスが細くなってきて、昔は気にもしなかったような トンネル効果やらリーク電流やらに悩まされるような感じか
525 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:12:53 ] >>521 つーか技術者なら、まず自分の無知を恥じろよ。 で、どういうカタチであれ知識を教えてもらったことを有難いと思えよ。 ま、アンタの場合、恥じるべきは自分の無知よりむしろ 年甲斐も無いDQNさだろうな。 もっぺん自分のレス読みかえせよ。 >>495 は人にものを尋ねる態度か? 簡単に自分に確かめられることなのに、自分で確かめようともせずに まるでケンカ越しで偉そうに聞いてたよな。 一体何様のつもりなんだか。
526 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:16:09 ] >>521 悔しいのはわかるが、それをばねに勉強するなど その気持ちをほかの方向へ向ける手もあるだろうに。
527 名前:495 [2007/07/06(金) 22:17:10 ] >>520 complex型とか色々増えたんだろ。 確か、enumも面倒くさい仕様になったんだよな。 全く知らないわけじゃないが、不要な機能も多そうだ。 C言語仕様で遊んでる奴らは、もっと基本に返って欲しいぜ。
528 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:19:12 ] 自分が最近の仕様に疎いという自己認識があるんなら 最初から>>462 みたいに偉そうに書かなきゃいいのに 初心者相手と思ってやったんならなおタチ悪いぞ
529 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:19:51 ] enum で何か大きく変わったっけ? 最後にコンマつけても良くなった程度じゃない?
530 名前:495 [2007/07/06(金) 22:25:49 ] ほら、説教オタが集まってきた。 これだから嵐はやめられん。 >>523 お前は常にアンテナを張っているといえるのか? >>524 それは『道具を作る』側の悩みだろ。現場だから悩みは直ぐ分かるぜ。 俺は言語を作ってるわけじゃない『道具を使ってる』側だから、勝手に変えられるのもこまるんだぜ。 >>525 そうさ、お礼をするつもりだったのさ。 その後は前に書いたとおりだ。二度も言わせるな。 人にモノを尋ねる態度じゃないと思ったら 答えなきゃいいじゃないか。それか無視すればいいんじゃね? 君の知識で答えられるとは思えないがな。実は今日初めて知った仕様じゃないのかい(w >>526 そのつもり。
531 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:26:54 ] 無視すればいいんじゃね? どうみても過剰反応の荒しなんだが。
532 名前:495 [2007/07/06(金) 22:28:11 ] >>529 ほーら。こう言う人もいる。 分かる奴はenum談義でもしてやれよ。ほら。さあさあ。
533 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:30:16 ] いまどきノーヘルで捕まって悔しがる馬鹿っているのか? そのレベルだろ
534 名前:495 [2007/07/06(金) 22:31:35 ] >>531 過剰反応じゃなきゃ嵐とは言えネー。 そして君は無視してなーい(藁)
535 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:32:37 ] >>534 漏れは楽しんでるからどんどん過剰反応してくれ
536 名前:495 [2007/07/06(金) 22:34:16 ] >>533 これだけ例えが分からん奴も珍しい。 心から軽蔑してやるぜ。
537 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:35:55 ] 何を今更、ってたとえ話だろ。
538 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:38:21 ] 文字通りの老害だね。 釣りじゃなければ
539 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:40:12 ] >>537 原付に乗っていきがっている中学生と似たようなもんだ、ということかと思った。
540 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:44:37 ] 免許持ってるおっさんだと仮定して話してしまった よく読んだら免許持ってるともおっさんだとも言ってないな 今は反省してる。
541 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:45:14 ] >521 なるほど。プログラマも更新必須の免許制に白って話だな。 んで、更新場で5000円はらって、「今度のC++09では〜こういう変更が〜」 みたいな話をありがたくちょうだいしろ、と。
542 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:50:41 ] >>521 法律は法律だろ…。 知らなかったなんて言い訳が通用するはずもない。 悔しいとか関係ないし。 自分で例えにもなってない例えを出しておいて、 よく他人に「例えが分からん」とか言えたものだな。
543 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:53:16 ] つーかC99ならまだしもC89なんて何年前の話だ
544 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:58:16 ] こいつの下についてる奴は哀れだな 普段から嬉々として間違ったことばかり言ってるが 「××さんそこはこうですよ」とか突っ込むと 逆切れして仕事にならんから適当な按配に放置されてると見た
545 名前:523 mailto:sage [2007/07/06(金) 23:00:35 ] >>530 当然だろ。おまえは違うみたいだけど
546 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 23:07:24 ] ってか、未来のコンパイラで使える技術と、 今の多くのコンパイラで使える技術ってちょっと違わないか? >>495 の内容は、コンパイルして確認できる程度のものだろ。
547 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 23:23:29 ] >検証してANSI-Cでは動的配列等の初期化ができると分かって来て見たら非難誹謗の嵐だ。 規格に当たれば済むことを、いい加減な検証で分かった気になるとは。 >わざわざお礼を言おうと思ったが、そんな非礼な人間に感謝の気持ちなどなくなった。 例を言うのに「わざわざ」なんて副詞をつけるくらいなら最初から言わない方がましだ。 >そうだよ。俺はANSI-C以前からC使いだった。 別に珍しくもないが、普通は今時のコンパイラに触れているうちに理解するもんだ。 >C++を黎明期から覚えて使い始めてからは、string系クラスが活躍してくれて string系? std::stringに類似品があったっけ? std::basic_stringのことか? >外的・静的配列以外に初期化子を使う必要もなかったからな。 無知蒙昧極まれり。 >君らが古いコードをメンテする憂き目に遭うことを祈ってるよ。 憂き目? まさか。温故知新と言う言葉はご存じないかな?
548 名前:495 [2007/07/06(金) 23:33:34 ] >>538 文字通りの老害だね。 そういう君の方が年上で無知だったりして。 2chで無意味なことを言う奴だ。 >>541 何言ってんの?免許制?そりゃあいい。 仕事だけじゃなく、きちんと新しい仕様を勉強する公な時間がとれるぜ。 君らも仕事するようになったら、アンテナ張るのが限界になることが分かるぜ、学生、失業者。 >>542 お前にゃ『例え』という概念も理解し難いらしい。 この例えが不適切だったと思う奴はちょっとレスしてみろ。 >>543 新しい仕様は受け入れるよ。そろそろ新しいC言語の教本を読む頃だ。 だが、K&R C言語の第2版でさえ、やはり自動変数の初期化子は 目の上のたんこぶ扱いだったようだ。 ゆとり世代がループ内で自動(配列)変数の初期化子なんか使われたら困るぜ。 >>544 安心しろ。会社ははけ口にならんからここに毒を吐いてるんだ。
549 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 23:36:40 ] アンテナ張るのも辛い職場ってどんだけブラックなんですか
550 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 23:40:36 ] 技術者として新技術の吸収が無理だと分かったら、そいつはもうそこまでだぜ このおっさんは汎用機と心中するしかないCOBOLerと一緒だな 周囲はゆとりと学生だけなんだ、自分は悪くないんだ、仕事やってりゃ皆こうなんだ、 と思い込もうとしてるんだね 実に哀れだね
551 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 23:43:48 ] >>548 (´・ω・`)⊃旦 < 毎日お疲れ様です、お茶ドウゾ。
552 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 23:49:41 ] 自分で試さずに「試しに書いてくれ」ってまるでゆとり世代のようだな
553 名前:495 [2007/07/06(金) 23:51:42 ] >>545 君は自分の無知を自覚しようとしない奴だ。 ソクラテスはそういう事を何と言ったか知ってるか? >>546 今日コンパイルしたのさ。 >>547 仕事中に新しい機能を覚える時間とそれを検証する時間をくれるなら進んでやるぜ。 社長は君かい(笑) >string系? std::stringに類似品があったっけ? std::basic_stringのことか? 世の中にはSTLしかないと思っている奴を発見した。 しかも、wstringすら知らない奴もいたもんだ。 それから温故知新の使い方が逆だ。 君の使い方は『古いことを知り、かつ新しい事を知るべきだ』という意味にしかとれないが、 本当の意味は 『新しいことを知るには、古いことを知っておく事も重要だ』という意味。 やれやれ。ゆとり君=>>547 。
554 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 23:55:42 ] >>553 が憂き目の意味を理解してるかどうかが気になる
555 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 23:57:12 ] どんどん香ばしくなっていくな
556 名前:495 [2007/07/07(土) 00:03:14 ] >>550 そういうなよ、ゆとり。 それより、採用試験に向けて、人と目を合わせて話す練習をした方がいいよ。 >>551 サンキュー >>552 そのときは思いもよらなかったからさ。 今日は仕事が一区切りつけたから検証できたんだ。 >>554 つらい体験 >>555 そう言うなよゾロ目 全員が無視されたら嵐は自然といなくなるんだぜ?
557 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:05:03 ] すごく・・・不毛です・・・
558 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:09:45 ] >>556 憂き目って、単につらいだけじゃなくて悲しいといったニュアンスも入るんだけど理解してる? それでいて使い方が逆とか言ってる?
559 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:14:54 ] 憂うっていうのは残念
560 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:20:56 ] まだやってんのか? 勉強の時間が取れないって割には暇なんだな。
561 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:20:58 ] いつから三つの数字をぞろ目と言うようになったのだろう……
562 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:21:58 ] >>553 > 仕事中に新しい機能を覚える時間とそれを検証する時間をくれるなら進んでやるぜ こういう人多いんだよねぇ ・プライベートで自己啓発しようという考えが無い ・新しいことにチャレンジして新しい技術を仕事と共に身につけようという考えも無い ・自分に時間的余裕が無いのは上が悪いせいだ ま、どうぞ勝手に腐ってくださいとしか
563 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:23:33 ] 土曜日だからってはしゃぎすぎだろ。 そろそろ寝ろよおっさん。
564 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:24:07 ] >>561 それはふつうに言うんでないか? ちんちろりんとかサイコロ3つ使うけど
565 名前:495 mailto:sage [2007/07/07(土) 00:28:19 ] >君らが古いコードをメンテする憂き目に遭うことを祈ってるよ。 >>558 よし答えてやろう。 憂き目がつらい体験というのはおおよそ間違ってないのではないかな。 それとも、『つらく悲しい経験』(goo辞書から抜粋)とでも答えてほしかったのかな? そして、学生や就職浪人なんぞの世代が古いコードをメンテしたとき、 コンパイラは当時の同じバージョンの処理系で コンパイルするのが常套ではないか? もちろん、新しいコンパイラを使っても構わないが、動くように直すより、当時の規格に沿って メンテした方が遥かに楽な場合が多いだろう。 そして、私の憎む君らが、知るべくもない仕様に基づいたバグにはまり、 (悲しく)つらい体験をするのを祈っているのだよ。 何か変?
566 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:31:11 ] ANSI以前のCで自動変数の配列を直接初期化できないのはまだ有名なほうだと思う。
567 名前:495 mailto:sage [2007/07/07(土) 00:34:10 ] >>560 眠いと勉強ははかどらないが、悪口ならいくらでもでてくるからなあ。 >>562 おやおや。私がまるで何も勉強してないとでも。 はい。腐るときは勝手に腐るのでいちいち構わなくてもいいですよ。 自称自己啓発君。>>562 君がせめて鬱で自殺しませんように(爆 >>563 さっき言っただろう。 嵐の敵はみんなの無視。 眠くなったら寝るから気にするな。
568 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:35:46 ] >>566 んだな。 つうかそれ、もし対応して無いコンパイラを使ったら、コンパイル通らないだけ じゃん。で、エラーメッセージが出力される。 全然困らんぞ。 ほんとうに昔のソースでは、確信犯的にリテラルを書き換えていることがあるが、 そっちのがまだ困るだろね。 ま、それに気づけば、コード書き換えるなり-fwritable-stringsを指定するなり すればいいわけだが。
569 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:38:05 ] >>565 「メンテする憂き目」じゃなくて、 メンテする際につらい体験をするのを祈ってるって話だったのか
570 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:39:26 ] みんなこんなおっさん弄ってあげるなんて親切だなあ
571 名前:495 [2007/07/07(土) 01:14:31 ] >>568 古いANSI-C(K&R第2版の頃な)で void foo { int a[100] = {0}; ... } とでも書いてみたまえ。コンパイルは通るがaの要素がa[0]以外全てランダム値で 深刻なバグに発展するかもしれんね? つまりだね。たかが一つ昔の仕様を回避したところで、 反証にはならんのですね。 それを何を偉そうに「全然困らんぞ」だって? 自分で気づいて直すならまだマシだが、納品後にクレームの電話。待ちますか?
572 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 01:17:42 ] 納品後ってコンパイル通ったらすぐ納品しちゃうの?そんなに切羽詰った職場なの?
573 名前:495 [2007/07/07(土) 01:28:59 ] >>572 ハイハイ。君の言ってる事は 「お前は何時何分地球が何回、回ったときに納品した?」 というレベル。 あっちでママが呼んでますよー。『そろそろ寝なさい』だって。ププ
574 名前:495 mailto:sage [2007/07/07(土) 01:31:27 ] もう厨房しか居ないし、寝るかな。 また明日ー。俺が気に入らなかったら削除依頼でも出しときな。
575 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 01:32:07 ] 明日も来る気ですかw おっさん忙しいんじゃなかったのかw
576 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 02:03:04 ] Kusakabe と毛色は違うが同類だな
577 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 02:26:42 ] 削除依頼ワラタ 削除したいのはお前だけだって
578 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 04:20:16 ] よっぽど自分の間違いを「なかったこと」にしたいんだろうなぁ。 こういう責任の自覚がない香具師が下らん犯罪の元仁になったりするんだ。 くわばらくわばら
579 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 05:51:35 ] 新しい仕様はC++には取り入れられないのかな?
580 名前:デフォルトの名無しさん mailto:s [2007/07/07(土) 05:51:49 ] 新しい仕様はC++には取り入れられないのかな?
581 名前:デフォルトの名無しさん mailto:s [2007/07/07(土) 05:51:57 BE:115689986-2BP(7)] 新しい仕様はC++には取り入れられないのかな?
582 名前:デフォルトの名無しさん mailto:s [2007/07/07(土) 05:52:02 ] 新しい仕様はC++には取り入れられないのかな?
583 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 10:19:27 ] >>524 そんな問題とは違うだろ 新しいルールは後から参加してきた守銭奴によって政治的に作られるんだから 自然の法則に従って限界に達して出てきた障害とは一緒にするな
584 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 10:23:09 ] >>579-582 www.open-std.org/jtc1/sc22/wg21/
585 名前:495 mailto:sage [2007/07/07(土) 10:55:13 ] なんだ。捨て台詞しかないのか。ツマラン
586 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 11:04:21 ] windowsのSIZEとかPOINTとかRECTの構造体で、 メンバの型をtemplate構文を使うことにより自由に決められるやつってありますか? こういうのって絶対誰もが考えると思うんだけどWTLにすらなくて・・・ 自力で実装するしかないんでしょうか?(´・ω・`)
587 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 11:07:04 ] はあ?
588 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 11:10:46 ] >>585 いい加減ネタも尽きて来たしな。 >>586 ないね。俺も考えたことあるけど。
589 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 11:29:17 ] >>586 あるよ。ほら。 template<typename T>class size { T width_; T height_; public: size() : width_(), height_() {} size(T width, T height) : width_(width), height_(height) {} size(const size & foo) : width_(foo.width()), height_(foo.height()) {} size & operator=(const size & foo) {width_ = foo.width(); height_ = foo.height(); return * this;} bool operator==(const size & foo) const {return width() == foo.width() && height() == foo.height();} T width() const {return width_;} T height() const {return height_;} T area() const {return width() * height();} }; 今作ったからバグってるかも知れないけど。
590 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 13:03:31 ] 環境依存すらOKのスレで、 古いANSI-Cが前提となっている理由が理解できない。 それは君の勉強不足だろうと。
591 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 13:18:15 ] やっぱ無いんですね・・・ とりあえずsizeは参考にさせてもらいます 仕方ないのでboostとか使ってSTL対応の格好いいのを作っちゃうことにします(`・ω・´) いざ出来ても動作が重いとかサイズを食うとかで結局使わない感バリバリですが…
592 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 13:22:47 ] つうかWin32APIに渡す時点で構造体サイズは結局そこに合わせなきゃいけないから RECT<float>とかしたところでたいした意味はない
593 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 13:29:28 ] 結局変換の時に一時オブジェクト生成する分オーバーヘッドになるだけですか… それでもAPIに渡すまででポータブルに扱う分には役立つだろうと思ったけどあまり意味無いですね(´・ω・`)
594 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 13:32:55 ] >>593 >589程度のクラスなら、どうせ最適化で消えるだろうからどんどん使えば? size, point, rect辺りの綺麗にまとまったテンプレートクラスにして公開してくれたら 積極的に使ってあげるよ。
595 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 21:38:05 ] C++の質問があります。 map<int, FUNC> MAP; キーをint型、値を関数ポインタで、関数ポインタに関しては、他のクラスのメンバ関数も セット出来るようにしたいのですが、FUNCの定義の仕方がイマイチ分かりません。 御願いします。
596 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 21:40:05 ] >>595 メンバ関数ポインタを他のクラスのも使えるようにするってあーた・・・・ thisポインタをどうやって区別するつもり?
597 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 21:40:20 ] boost::function
598 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 21:46:26 ] >>595 つBoost.Bind
599 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 21:47:36 ] >>598 bind は型じゃないだろ。
600 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 21:49:57 ] 仮想関数へのポインタなら、基底クラスの関数ポインタを使っとけば大丈夫。
601 名前:デフォルトの名無しさん mailto:age [2007/07/07(土) 23:36:29 ] オーバーロードされたコンストラクタについて質問です。 class A { int data; public: A(int x, int y){ data = x+y; } A(int x){ A(x, 0); } }; のような感じで、2つ目のコンストラクタは1つ目のコンストラクタを内部で呼んでいるのですが、 うまく値が入りません。 (これは例なので簡単にしてありますが、実際はもっと複雑なことをしています) コンストラクタの中で別のコンストラクタを呼ぶことはできないんでしょうか? いちおうコンパイルは通るのですが。
602 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:39:16 ] できない。 A(x, 0)は単に一時オブジェクトを作る式となるだけ。 元のオブジェクトとは何の関係も持たない。
603 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:41:01 ] 何でデストラクタは単体で呼べるのにコンストラクタは呼べないの?
604 名前:601 mailto:sage [2007/07/07(土) 23:42:02 ] なるほどそういう意味ですか。 ではどうするのがスマートなやりかたでしょうか? 初期化用の関数を作ってそれぞれのコンストラクタから呼ぶのがいいんでしょうか?
605 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:47:29 ] 結局それが一番だよ。
606 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:47:43 ] >>603 placement new を使えば単体でコンストラクタを実行することはできる。 でもコンストラクタの中で自身に対して使っても正しい意味は成さない。 デストラクタだって、デストラクタの中から自身に対して呼んだりしちゃいけない。
607 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:13:21 ] deleteするとき、与えられたポインタの型が元のポインタの型ではなかった場合でも、正常に削除できますか? int *int_ptr = new int; void *void_ptr = reinterpret_cast<void *>(int_ptr); ... delete void_ptr;
608 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:24:20 ] PODならmalloc/freeでいいんでないの。
609 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:38:01 ] >>607 deleteでは、オブジェクトのデストラクタを呼んだ後 メモリを確保する必要があって そのデストラクタが正しく呼べるなら違うポインタ型にしてもOk。
610 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:48:13 ] みなさんデストラクタの戻り値はチェックしていますか?
611 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:49:47 ] >>610 基本中の基本
612 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:56:12 ] 僕はコンストラクタの戻り値もチェックしてまつよ(`・ω・´)
613 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:56:44 ] >>610 無理。
614 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:59:01 ] >>607 ダメ。未定義動作。 5.3.5p3
615 名前:デフォルトの名無しさん [2007/07/08(日) 01:13:30 ] C++を始めてする人にオススメという本はないでしょうか 自分はC言語を少し齧った程度で、オブジェクト指向の意味すらわかりません
616 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:19:40 ] >>615 メイヤーの「Eiffelオブジェクト指向入門」がオススメ
617 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:27:51 ] >>616 教えてくれてありがとうございます、明日辺り早速本屋で探してこようと思います
618 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:39:11 ] おいおい
619 名前:617 mailto:sage [2007/07/08(日) 01:40:38 ] >>618 おいおいとか言われたら不安になるじゃないかぁーーー!!
620 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:41:25 ] おれはこのページだけで勉強した ttp://www.asahi-net.or.jp/~yf8k-kbys/ 少し古いけど初心者が勉強するには十分
621 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:49:14 ] >>620 全俺が感動した
622 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:04:16 ] >>617 俺もその本は持っているが、とても実践向きじゃない。 十数年前はオブジェクト指向なんて言葉自体珍しかったから、名前だけで買ってしまった。 Eiffel(エッフェル)なんて、謎の言語を覚える気なら敢えて止めはしない。
623 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:24:20 ] オブジェクト指向理解のためなら、JavaかC#あたりのほうがとっつきやすい。 C++はいろいろ細かいルールが多すぎて焦点がぼける感がある。
624 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:37:45 ] 細かいルール云々というよりC++はマルチパラダイムなために、 オブジェクト指向に限らないというのが逆に理解のネックになるのかもな。 初心者だった頃先輩に薦められてModernC++Designを読んだときは一気に挫折しかけたwww
625 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 07:30:41 ] SADでも必死に会社に行っている人 [メンタルヘルス]
626 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 07:57:28 ] >>607 "デストラクタ virtual" でぐぐれ
627 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 08:41:03 ] >>620 そのサイトは間違いを指摘しても直さないから余りお勧めできないが。
628 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 09:14:02 ] 最初に勉強に使ったページ www.asahi-net.or.jp/~yf8k-kbys/newcpp0.html と www.geocities.jp/ky_webid/cpp/language/index.html 補足に使ってるページ www.cmagazine.jp/src/kinjite/cpp/index.html homepage2.nifty.com/well/Index.html www.scl.kyoto-u.ac.jp/scl/appli/appli_manual/SUNWspro/WS6U2/ja/manuals/stdlib/user_guide/general/index.htm www.s34.co.jp/cpptechdoc/
629 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 09:44:26 ] >最初に勉強に使ったページ >www.asahi-net.or.jp/~yf8k-kbys/newcpp0.html >627 >www.geocities.jp/ky_webid/cpp/language/index.html 不明。 >補足に使ってるページ >www.cmagazine.jp/src/kinjite/cpp/index.html ダメダメ。 >homepage2.nifty.com/well/Index.html >www.scl.kyoto-u.ac.jp/scl/appli/appli_manual/SUNWspro/WS6U2/ja/manuals/stdlib/user_guide/general/index.htm >www.s34.co.jp/cpptechdoc/ 不明。
630 名前:デフォルトの名無しさん mailto:s [2007/07/08(日) 09:55:37 ] C の勉強を K&R だけでやった。 C++ というかオブジェクト指向の入門を C Magazine の 連載だったと思う A級B型C++ だけでやった。 あとはテクニック本をよみつつ、本当に疑問に思った仕様は おおもとの仕様書(規格書)にあたる。
631 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 10:02:40 ] >>627 暇そうなのにね
632 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 10:05:09 ] 不明=別にどっちでもいいよって事だな えぴの記事は内容は古いけど初心者がC++の深遠を覗くにはいいと思うし あとC++プライマーとか普通の入門書を一冊手元においておけばどんなページでも役に立つと思うぜ
633 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 10:06:09 ] >>630 仕様とパラダイムは違うからねぇ
634 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 10:39:28 ] VC++とWin32APIプログラミングの違いが分かりません(´・ω・`)
635 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 10:51:09 ] ワープロと小論文の違いがわかりませんと言われても困る。
636 名前:デフォルトの名無しさん mailto:s [2007/07/08(日) 11:12:10 ] VC++使ってるけど Win32 API なんてほとんど使わないなぁ。
637 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 11:44:44 ] 俺ライブラリとかATLとかその他公開されているライブラリにラップして使ってる人が殆どだと思う
638 名前:デフォルトの名無しさん [2007/07/08(日) 13:28:24 ] 10年前にVC++6.0使ってたんだけど、 今はWindowsでのC++開発環境って何がメジャーなの? VC++2007ってありますか?
639 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 13:30:39 ] 残念ながらVS2008になりそうです
640 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 13:41:35 ] >>638 「VC++」でぐぐるとVisual Studio 2005のページが出てくるから、とりあえずそこ読んでおけ
641 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 13:44:19 ] cygwin/gcc/g++ mingw
642 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 15:24:33 ] コンパイル時に数が決まっている要素の数をカウントしたいんですが、
643 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 15:29:09 ] elementofマクロの話?
644 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 15:47:34 ] すみません。途中で送信されてしまったようです。 コンパイル時に数が決まっている要素(あるクラスを継承しているクラス)の数をカウントしたいんですが、 マクロの様なものを単純にコピペするだけでカウントするにはどうすればいいんでしょうか。
645 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 16:01:43 ] 詳細が分からんと何も言えん
646 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 16:18:54 ] あるクラスを継承しているクラスの総数を知りたい? それはリンク段階でしか判らないこと無いか?
647 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 16:36:31 ] 同一ソースコードに書いてあるので、コンパイル時にコードを下へ逐次見ていくだけで機械的にカウントできます。
648 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 16:37:28 ] 今boost::preprocessorを使ってもがいてます...
649 名前:デフォルトの名無しさん [2007/07/08(日) 16:46:40 ] VC++1.51をWIN98で使ってるんですが、DOSのプログラムを組んで走らせると ハングする事が多いです。BCC5.5でコンパイルすると問題無く動くのですが。 1.51でDLL16使うのはWIN95までしか対応してないのでしょうか。
650 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 16:58:25 ] >>649 IDE自体はWin9x/NT系で動かすとハングしやすいな。 デバッグ実行は特にめろめろだが、 作ったプログラムが単体でハングするならそれはあなたの作ったバグ。
651 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 18:10:53 ] builderで、警告が100個超えたら、 「エラーあるいは警告が多すぎる」と、最後にエラーが出てきました。 警告の上限の数は、決まってますか?
652 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:26:18 ] C言語でputchar('a');みたいに'あ'を出力するにはどうすれば良いでしょうか? ググってみたら #include <stdio.h> #include <wchar.h> int main(void) { putwchar(L'あ'); return 0; } こうかと思ったのですが、どうも違うようでよく分からないですorz
653 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:27:39 ] printf("あ");
654 名前:デフォルトの名無しさん mailto:s [2007/07/08(日) 19:27:52 ] Visual C++ 2008 になったら tr1 とかも実装されるのかな。 C99 互換モードとかもつくのかな。
655 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:28:17 ] >>651 コンパイラ次第
656 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:31:01 ] >>653 書いた後でそう言われそうだと思ったけど、 そういう意味じゃなくて、 int hoge='a'; putchar(hoge); こういう感じで'あ'を扱うにはどうしたら良いでしょうか?
657 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:36:28 ] a と あ って全然違うだろ。1バイトと2バイトだし
658 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:37:19 ] UTF-8 なら3バイト。
659 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:39:29 ] >>656 char hoge="あ"; putchar(hoge);
660 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:39:44 ] >>659 コンパイルエラー
661 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:40:43 ] wint_t hoge='あ'; putwchar(hoge);
662 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:40:44 ] >>659 それなら、 char hoge[]="あ"; にしないとまずいだろ。
663 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:43:25 ] あまりにもひどい流れだ
664 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:48:08 ] >>660 自分もそうやるのかと思ったんですが、 それだと何も表示されないです。(VC++2005で)
665 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:56:05 ] ぬるぽ
666 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 19:56:43 ] 666
667 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 20:02:53 ] ロケール?
668 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 20:06:59 ] あはなぁ・・・・
669 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 20:16:32 ] 文字型を文字列で初期化できるわけねーだろ
670 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 20:22:14 ] >>652 ↓で良いが、例えばVC++8.0(VS2005)ではバグによって何も表示されない。 wchar_tやロケールまわりをまともに使える処理系か確認するこった。 #include <stdio.h> #include <wchar.h> #include <locale.h> int main(void) { setlocale(LC_CTYPE, ""); putwchar(L'あ'); return 0; }
671 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 20:29:35 ] wchar_t を使う事は根本的な解決になってるんだろうか。
672 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 21:06:30 ] >>652 #include <stdio.h> #include <wchar.h> #include <locale.h> int main(void) { setlocale(LC_ALL, ""); putwchar(L'あ'); return 0; } Visual C++ 2005だとこれだけではバグってだめみたいだけど。
673 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 21:23:41 ] >>670 ,>>672 ありがとうございます。 ちょっとbcc入れるのに手こずってました。 bccだと無事に動くっぽいですが、VCではダメなんですね。 しかしこれって単純に出来るものかと思ってたら、 意外と上手いこといかないものなんですね><
674 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 21:25:33 ] >>673 VC++でも以前のバージョンなら問題なく動くんだがな
675 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 21:39:11 ] Visual Studio 2005買うか迷う 早く2007か2008発売してくれたらいいんだけどな…
676 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 21:41:47 ] 今買うのはいかにも時期が悪いだろう バグ持ちだしな(SPでも直ってねぇし)
677 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 22:26:22 ] おれはEclipse派
678 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 22:50:56 ] あれだけ難しいと思ってた「C言語ポインタ完全制覇」が今なんとなく読んだら 全部スラスラと理解できてワロタ 昔買った本読み返すとあぁ俺ちゃんと成長してると実感できてうれしいなw
679 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 22:52:44 ] ちょうどあるから読んでみよっと
680 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 22:55:05 ] Modernはいまだに7割くらいしか理解できん…
681 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 23:54:54 ] >675 2008は4Q(多分12月ごろ)。MSDNにすれば?
682 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:30:28 ] すみませんが質問です。 ある関数のバイナリを表示するプログラムを作ったのですが思ったとおりに表示されません。 source: #include <stdio.h> int func(void)//この関数のバイナリを表示したい。 { return 0x12345678; } void fend(void){}//func関数の終わりをこの関数のアドレスから求める。 int main(void) { char *p; char i; p = (char *)func;//func関数のアドレスをchar型のポインタへ代入。 for(i=1; p<(char *)fend; i++) { printf("%2.2X ", *p++);//func関数のバイナリを1バイトごとに表示。 if(!(i%16)) putchar('\n');//とりあえず16バイトごとに改行。 } return 0; } result: 55 FFFFFF8B FFFFFFEC FFFFFFB8 78 56 34 12 5D FFFFFFC3 55 8B EC B8 78 56 34 12 5D C3と表示されるのを期待していたのですがうまくいきません。 コンパイラはBorlandコンパイラです。 根本的な間違いの指摘、もしくは強引な方法でうまく表示させる方法を教えてください。
683 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:34:30 ] >>682 そこまでできてるんなら char を unsigned char にすればいけそうな気はするね。 でも、移植性のあるコードじゃないことは理解しておけよ。
684 名前:682 mailto:sage [2007/07/09(月) 01:36:30 ] >>683
685 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:37:00 ] pの型を char → unsigned char
686 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:38:46 ] ついでに、%2.2Xは%Xで大丈夫な希ガス
687 名前:682 mailto:sage [2007/07/09(月) 01:39:53 ] ミスりました。 >>683 ありがとうございます。 解決できました。 移植性のないコードであることは百も承知でございます。 cl.exeでコンパイルするとうまくC3のret命令で終わらなかったです。 ただ、アセンブリの勉強のために作ったので自らの環境で動けば問題なしです。 ご丁寧にどうもありがとうございました。
688 名前:デフォルトの名無しさん [2007/07/09(月) 01:45:28 ] 1byte文字、2byte文字が混ざった文字列から、 1文字ずつ読み込んで、これが1byteか2byteか判定するにはどうしたら良いでしょうか? お願いします。
689 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:48:08 ] txtから数字を読み込んでバブルソートするプログラムを組みたいのですが (数字は一行ずつ記述された状態) 出来ればそのあとさらにtxtに出力したいです fgetsに関する記述方法がいまいち理解できないです この後にどのような記述をすればいいのでしょうか #include<stdio.h> #include<stdlib.h> #define swap(type,x,y) do{type t=x;x=y;y=t;}while(0) int bubble(int a[],int n) { int i,j; for(i=0;i<n-1;i++){ for(j=n-1;j>i;j--){ if(a[j-1]>a[j]){ swap(int,a[j-1],a[j]); } } } } int main(void) { FILE *fp; if((fp=fopen("data.txt","r"))==NULL){ printf("file open失敗\n"); exit(1); } while(fgets(
690 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:49:02 ] gccだと型そのままでも %02hhX にすれば問題なく表示できるんだが bccでも同じなのかどうかは知らない まぁ、バイナリ扱うなら unsigned char にしとくほうが良いだろうけど
691 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:56:53 ] >>689 フォーマットが固定ならfscanfで読み込んでfprintfで出力すれば良いだけだと思うけど fgetsで読み込みたいなら読み込んだ奴をstrtolするかsscanfにかければいいし
692 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 02:08:14 ] カレーが食べたいよ
693 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 04:08:03 ] >>678 遅レスだけど、俺もスラスラ読めて、さらには 「JAVAだとどうだとか、ほっといたれや」 とまで思ったりして、はじめ読んだときは「なるほどな〜」と 思ってたのに、今じゃ文句までつけやがる俺。 どんどんひねくれていく自分に嫌気がさす。
694 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 07:03:58 ] >>682 func と fend がメモリ上で連続する保証はあるの?
695 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 08:13:30 ] >>694 ない。でも>>687
696 名前:デフォルトの名無しさん [2007/07/09(月) 14:14:04 ] age
697 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 14:15:09 ] sage
698 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 15:40:00 ] おしえてください (VC++ 6.0 MFC) エディットコントロールに複数行の文字列を表示させた時、 その時のスクロールの位置を一番下の行にしたいのですが、うまくいきません。 m_editMsg.SetWindowText( m_strLog ); m_editMsg.SetScrollPos( SB_VERT, m_editMsg.GetScrollLimit( SB_VERT ) ); この処理を行うと、スクロールバー自体は一番下の行に移動した様な表示になるのですが、 表示される文字列データは、先頭部分が表示されてしまいます。 どうしたらいいのか教えて下さい。お願いします。
699 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 16:24:14 ] エディットは、キャレットの位置を動かせ EM_SETSEL 使えばいいかな。
700 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 16:44:31 ] >>687 関数間が NOP (90h) で埋められてるなら NOP が出てくるまで・・・と出来そうな気はするけど、 コードの途中で境界合わせに NOP が出てこない保証もないし、 ダメかなあ・・・。
701 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 16:58:25 ] >>700 定義順に関数アドレスが並ぶ保証はどこにもないよ
702 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 17:12:31 ] >>699 ありがとうございます。調べてみます。
703 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 17:51:57 ] >>701 ?
704 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 18:17:06 ] >>700 関数間がNOPで埋められる保証もどこにも無いよ。
705 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 19:37:39 ] >>704 「関数間が NOP (90h) で埋められてるなら」 という条件付きで話してる事に、そう言われても・・・
706 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 19:42:30 ] この手の板にはよくあること
707 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 19:43:36 ] 関数のアドレスが、ジャンプテーブルだったりするのも よくある話。
708 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 20:06:18 ] C++だけではGUIって作れない? API勉強しないとだめ?
709 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 20:09:33 ] >>708 「C++だけ」ってのが「標準C++ライブラリだけ」ってことならyesだな
710 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 20:19:22 ] >>709 ありがとう。さすがにCUIばっかりで飽きてきちゃったからAPI勉強してみる(`・ω・´)
711 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 20:34:28 ] >>709 否定形の問いかけに対して安易にyesと答えてはいけないw
712 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 20:56:37 ] >>705 VC2005だとそうなっては無かったから、 結構多くのコンパイラでその仮定は間違っているんじゃ無いの? と思っただけ。 どっちにしても>>700 はあんまり意味無さそうだね。
713 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 21:24:20 ] >>707 vc8のインラインアセンブラだと × call printf ○ call dword ptr [printf] ○ call test_func ○ call dword ptr [test_func] (test_funcは同じオブジェクト内の自作関数) じゃないとうまく動かなかった。 不思議なような、そうでもないような。うーん。
714 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 21:32:18 ] call printfがだめなのは、ランタイムDLLを使っているからという可能性は無い?
715 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 21:40:08 ] >>714 That's right ! そのとおりだった! ってか、前にMTでテストしたはずだったんだけどな・・・orz
716 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:51:37 ] 関数最後のサブルーチンコールはジャンプで実装する最適化もあるぞ。
717 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 00:19:18 ] >>712 昔の VC6 くらいそうなってなかったかなあ。
718 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 09:55:26 ] 2005もDebugとReleaseで違うしな
719 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 21:51:23 ] 質問です。 基本的にMFCのDoc-Viewを用いたプログラムです。自分で生成した特定の ウィンドウのスナップショットを、画像に保存したいのですが、どのようなアプローチで 進めたらいいのか悩んでいます。 1. 非アクティブまたは非表示な場合でも、フレームを含めたウィンドウ全体を 画像として取得するような手段はあるのでしょうか? 2. 1.が不可能なら、非アクティブまたは非表示で、ウィンドウの内容(例えばCViewの 中身)のみを取得する手段はあるのでしょうか? XP VC2005 SP1
720 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 22:07:13 ] fgets(str,N-1,stdin); printf("%d",(int)strlen(str)); ↑な感じのコードを書いて実行させると、 【実行画面】 >hoge 5 となるのですが、これってどうなっているのでしょうか?
721 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 22:12:05 ] hogeの後に改行文字がくっついてて、それも数えられてるから
722 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 22:14:58 ] あぁ、改行文字を読み込んでたのか! ヌル文字は入れないはずなのになんでかと思ったら…。 >>721 サンクスです!
723 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:00:52 ] >>718 2005だとRelease,Debugとも基本的にNOPは使ってないよ。
724 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:24:29 ] char str[10]="piyo"; これでstrが指す場所を"yo"にしたいのですが、 どうすれば良いでしょうか?
725 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:25:23 ] >>724 strcpy(str, "yo");
726 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:28:13 ] >>725 char *str2 = &str[2];
727 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:31:52 ] >>725 文字列をコピーしたいってより、yoの場所まで移動させたいのです。 array[i++]=strtol(str,&err,0); これを繰り返し行う際にstrをstrから任意のバイト分進めた値にして 文字列を完全に走査、数値格納したいのです。
728 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:39:50 ] そのstrは配列だからそもそも指すとかそういう表現はしない &str[2]とかstr+2好きなように表記すればよか これが気持ち悪いなら別途charへのポインタ用意して char *p=str; とした後に読み進めたいバイト分だけp+=2みたいにインクリメントすればいい
729 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:41:26 ] char* p = &str[2]; でいいんじゃね
730 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:44:48 ] str[i]2
731 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:46:04 ] >>727 strtol の使い方が知りたかっただけなんだね #include<stdio.h> #include<stdlib.h> int main(void){ long value[100]; char str[]="100 200 300 400 500 x 600 777"; char *ptr=str, *endptr; int i, value_num=0; for(value_num=0;value_num<100;value_num++){ value[value_num]=strtol(ptr, &endptr, 10); if(ptr==endptr) break; ptr=endptr; } for(i=0;i<value_num;i++){ printf("%ld\n", value[i]); } return 0; }
732 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:47:28 ] >>726 ,>>728-729 なるほど、ありがとうございます。 それを参考にちょっと今から思った通り出きるか作ってみます。
733 名前:732 mailto:sage [2007/07/11(水) 00:34:56 ] で、出来た…。 >>731 さんのものを参考に、一行にある複数数字(途中非数字あり) を格納して表示するプログラムを作ってみました。 これってあと直すところとかどうでしょうか? >12 32 aaa43jfie55 32 たとえば入力が上のようなら、 12,32,43,55,32が配列に格納されて表示される仕様です。 #include<stdio.h> #include<stdlib.h> #include<string.h> #define N 256 int main(void){ long value[N]; char str[N]; char *ptr=str, *endptr; int i, value_num=0,l; fgets(str,N,stdin); l=strlen(str)-1; for(i=0;i<l;i++){ if(strtol(ptr, &endptr, 10)!=0) value[value_num++]=strtol(ptr,&endptr,10); ptr=++endptr; } for(i=0;i<value_num;i++){ printf("%ld\n", value[i]); } return 0; }
734 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 00:37:08 ] #define N 256
735 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 00:37:13 ] あれ、>>732 で>>731 さんへのアンカを入れ忘れてました…。 申し訳ない、>>731 さんも激しくありがとうございます。
736 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:01:54 ] どなたかC++に詳しい方、教えてください。今日、はまりました。 以下ClassAに、オーバロードしたfunc()という関数が2つがあるとします。 ClassAを継承したClassBをnewし、classb->func(NUM_2);をコールすると、期待通りに ClassA::func(NUM)がコールされるのですが、(1)だけオーバライドしたClassCを newし、classc->func(NUM_2);をコールするとClassC::func(int, NUM)がコールされて しまいます。 期待した動作はClassA::func(NUM)がコールされる事でした。 これはC++の仕様なのでしょうか。コンパイラがどういう論理でenumを使用した関数の オーバライド/オーバロードを解決しているのかご存知の方、ご教示お願いします。 enum NUM { NUM_1, NUM_2, NUM_3 }; class ClassA { virtual int func(int a, NUM b = NUM_1); // ←(1) virtual int func(NUM a = NUM_1); // ←(2) }; class ClassB : public ClassA { // ClassAの(1),(2)はオーバライドしていないクラス }; class ClassC : public ClassA { // ClassAの(1)だけをオーバライド int func(int a, NUM b = NUM_1); };
737 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:03:17 ] つwww.fides.dti.ne.jp/~oka-t/cpplab-hide-overload.html
738 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:06:12 ] 呼び出し側のコードはどうなってんの
739 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:12:08 ] NUMばっか出てきてとか見づれーんだよ。もっと考えて書けよドカスが >classc->func(NUM_2);をコールするとClassC::func(int, NUM) 理由は>>737 だ ClassCでfunc(int,NUM)を宣言しちゃったから、ClassAのfunc(int,NUM)が見えなくなってる。 あとvirtualな関数にデフォルトパラメータつけるな
740 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:58:14 ] >>737 >>738 >>739 見づらくてすいません。 C++にそんな仕様があるとは知りませんでした。 ありがとうございました。 参考までに >あとvirtualな関数にデフォルトパラメータつけるな は何故でしょうか?
741 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 02:10:29 ] デフォルトパラメータは静的な型に依存する class B{ virtual void foo(int a=300){std::cout << a;} } class D{ void foo(int a=100){std::cout << a;} } B* pb = new D(); pb->foo(); //300と表示される D* pd = new D(); pd->(foo); //100と表示される だった筈
742 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 02:11:50 ] >>741 > pd->(foo); モチツケ
743 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 02:24:20 ] >>741 なるほど。納得しました。 ありがとうございます。
744 名前:デフォルトの名無しさん [2007/07/11(水) 10:08:49 ] >>188 PHPアプリとCアプリとログ出力先を共通化という 無茶な事を要求されているときも 行単位の一発書き込みなら大丈夫かな? 2プロセス立ち上げてそれぞれ適当に書き込みをさせて 100万回くらいテストしたんだけど これで混ざんなかったから 多分大丈夫だよね?
745 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 10:52:14 ] >>744 「行単位の一発書き込み」がシステムコールレベルでそうなっているなら大丈夫。 具体的には、(直接的または間接的に)O_APPENDでopen()されており、write() 一発で1行を書き込んでいるなら大丈夫。 それから少しでもズレるならダメ。 Win32の場合、O_APPENDに相当する機能がCreateFile()に存在しないので、 *必ず*排他が必須になるようだ。
746 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 14:55:19 ] 質問失礼します。 シャノンの符号化法による符号語生成プログラムと、 表計算ソフトを用いた符号語生成の違いについて説明して頂けないでしょうか? よろしくお願いします。
747 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 16:23:30 ] >>746 表計算ソフトを用いた符号語生成って、何のことか教えて。
748 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 21:59:26 ] >>743 ちなみに741の問題を回避するためにもNVIパターンが使えるぞ。
749 名前:デフォルトの名無しさん [2007/07/12(木) 08:23:23 ] すみません string型でファイル名を持っているとき、それをオープンしようとすると エラーが出ます。char型にするにはどうすれば良いですか?
750 名前:749 [2007/07/12(木) 08:26:48 ] 自己解決しました
751 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 08:26:59 ] つc_str()
752 名前:デフォルトの名無しさん [2007/07/12(木) 08:27:49 ] ありがとうございました
753 名前:デフォルトの名無しさん [2007/07/12(木) 08:51:04 ] ファイルを読み込むとき、終端で必要以上のサイズを 読み込むと配列が最後まで埋まってしまいます どうすれば実データのみ読めますか?? fp.read(str,N); とすると strのサイズはNになります
754 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 08:58:00 ] 何使って読み込んでるの? fp の型は?
755 名前:デフォルトの名無しさん [2007/07/12(木) 09:04:02 ] fstream fp ("filename", ios::in | ios::binary ); なんですけど、fp.read(str,N); の戻り値は、istream 型です どうすればサイズがわかりますか??
756 名前:755 [2007/07/12(木) 09:24:03 ] 自己解決しました fp.gcount();で読み込みサイズが出ました