1 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:25:51 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.63【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1231499251/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
369 名前:デフォルトの名無しさん [2009/03/12(木) 19:44:28 ] Windows上のC++の質問なんですが、プロパティの中のコード生成のランタイムライブラリーには /MT /MTd /MD /MDd の4つの選択肢がありますが、デフォルトは/MDdだと思いますが、本のサンプルを実行する際に、 /MTdに変更するように指示があり、実際変更しなければコンパイルできませんでした。 どういう場合に/MTdにしなければだめになるのでしょうか?
370 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 20:13:31 ] >>369 ソリューションの構成をDebugからReleaseにする ツールバーの下にDebugっていうドロップダウンリストがあるからそこで切り替えろ
371 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 20:22:34 ] ネットワーク共有ファイルに対してFindFirstFileを行うにはどうすればよいのでしょうか? 例えば \\Server\folder\test.txt にあるファイルに対して FindFirstFile( "\\\\Server\\folder\\test.txt",&data ); とやっても失敗になってしまいます。 ショートパスからロングパスにしたいのですが、、、、
372 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 21:58:54 ] ドライブにマウントしてから x:\test.txt とかでアクセスすればいいのでは?
373 名前:デフォルトの名無しさん [2009/03/13(金) 14:45:20 ] 2chトリップ生成プログラム教えてください。 ライブラリ作った人とかいますか?
374 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 15:17:00 ] 団子さんの出番ですね!!
375 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 15:21:22 ] やばい、>>374 と同じ事が頭に浮かんだ
376 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 15:37:46 ] >>373 2chのトリップと互換のPHPやらPerlやらの掲示板ソースでも探したらあるよ
377 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 15:40:55 ] [環境]C++ WindowsMobile向けアプリ(練習でデスクトップ版を作ります) GoogleCalendarとの同期を取るアプリを作りたいんですが、 最初の認証(ユーザーアカウント&パスワード)をどうやって投げれば いいのかご存知の方いらっしゃいましたら、ご教授願えないでしょうか?
378 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 15:44:06 ] >>373 PHPのを探してきた $trip = ''; if (preg_match("/([^\#]*)\#(.+)/", $_POST['FROM'], $match)) { $salt = substr($match[2]."H.", 1, 2); $salt = preg_replace("/[^\.-z]/", ".", $salt); $salt = strtr($salt,":;<=>?@[\\]^_`","ABCDEFGabcdef"); $trip = substr(crypt($match[2], $salt),-10); $_POST['FROM'] = $match[1].'</b>◆'.$trip.'<b>'; } cryptがDESかMD5かで結果が変わる
379 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 15:55:43 ] >>373 Cのソースがあった www.geocities.com/tk2001b/utripper/
380 名前:デフォルトの名無しさん [2009/03/14(土) 20:40:26 ] using namespace std; とソースの上に書くのと、 ソース全体を namespace std { ... } というようにnamespaceの中に書くのとは、同じ意味ですか?
381 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 20:45:14 ] 違います
382 名前:デフォルトの名無しさん [2009/03/14(土) 21:00:19 ] ありがとうございます。 どう違うか、教えてください。
383 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 21:04:06 ] 利用と宣言の違い棚。
384 名前:デフォルトの名無しさん [2009/03/14(土) 21:11:37 ] わかりました。 後者の場合stdの中で宣言するというだけなので、Main関数を入れたりとかは できないということですね。 ありがとうございました。
385 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 21:22:45 ] std 名前空間内に自分で宣言を追加してはいけない。 規格上未定義動作になる。
386 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 00:23:57 ] std::swapの特殊化は置いてもいいけどね。
387 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 00:31:35 ] std::swapの特殊化じゃなくて、テンプレートの完全特化が許されてるってことね
388 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 01:03:47 ] stringのvectorにファイルを一行づつ読み込んで、まとめて別のファイルに書き込むというプログラムを作ってるんですけど エラーチェックは↓見たいな感じで十分ですかね? #include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; void read(char *file, vector<string> &lines); void write(char *file, vector<string> &lines); int main(void) { vector<string> lines; read("C:/Work/from.txt", lines); write("C:/Work/to.txt", lines); cout << "正常終了" << endl; return 0; }
389 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 01:04:39 ] void read(char *file, vector<string> &lines) { ifstream ifs(file); if(!ifs.is_open()){ cout << "コピー元ファイルを開けない" << endl; exit(EXIT_FAILURE); } while(ifs.good()){ string line; getline(ifs, line); lines.push_back(line); } if(!ifs.good() && !ifs.eof()){ cout << "読み込み途中でエラー" << endl; ifs.close(); exit(EXIT_FAILURE); } }
390 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 01:05:31 ] void write(char *file, vector<string> &lines) { ofstream ofs(file); if(!ofs.is_open()){ cout << "コピー先ファイルを開けない" << endl; exit(EXIT_FAILURE); } vector<string>::iterator i = lines.begin(); while(ofs.good()) { ofs << *i; if(++i == lines.end()) break; ofs << endl; } if(!ofs.good() && !ofs.eof()) { cout << "書き込み途中でエラー" << endl; ofs.close(); exit(EXIT_FAILURE); } }
391 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 01:39:45 ] while (!feof()) {} と同じ匂いを感じる。 ところで、 while (...) { string str; ... } より string str; while (...) { ... } の方が、コンストラクタとデストラクタが毎回走らない分、コスト的には良いよね? でも、スコープを限定した方が可読性等の面からは好ましいよね? どっちが良いのかな。
392 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 01:44:22 ] その辺を言い出したらvectorから見直しだけどな。
393 名前:デフォルトの名無しさん [2009/03/16(月) 02:11:37 ] >>391 {string str; while(...){...}}
394 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 02:26:56 ] for(string str; ifs.good();)
395 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 02:36:54 ] 初期化がループに依存しないならコンパイラが良きに計らってくれると思うよ。
396 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 02:40:10 ] getline(,)後!ifs.good()でも1回push_backしちゃうのはマズくないか。
397 名前:デフォルトの名無しさん [2009/03/16(月) 07:38:25 ] VC++9での質問です。 あるライブラリをインクルードする必要があるのですが、 ソース中に #pragma comment(lib, "ライブラリ名") と書くと、LNK2005のエラーが出ます。でも、 プロジェクト→プロパティ→リンカ→追加のライブラリ のところに「ライブラリ名」を書くとLNK2005は出なくなりコンパイルできます。 リンクの順序が関係してるのかと思ったのですが、よくわかりません。 どういう基準で方法を選べばいいですか?
398 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 07:41:35 ] >>397 ライブラリのパスを通せばいいと思う
399 名前:デフォルトの名無しさん [2009/03/16(月) 07:50:49 ] >>398 ありがとうございます。 ライブラリは見えてます。LNK2005は、同じライブラリを複数回リンクしようとした、 というエラーみたいなのです。自分の場合、 unsigned int *a = new unsigned int(100); みたいな行がエラーになります。でもLNK2005が出ないやり方でリンクすると この行も問題なくコンパイルされます。 書いてて思ったのですが、追加のライブラリのところにライブラリ名を書くと、 Visual Studioがリンクの順序を勝手に調整してくれるんですかね?
400 名前:デフォルトの名無しさん [2009/03/16(月) 13:38:45 ] あるテーブルより、KOJIN_ID(数値型8桁)を一旦ホスト変数H_KOJIN_IDに入れ それを11桁の文字型として出力しなければいけないのですが(余った桁はスペースで埋める) 下記のようにsprintf関数を使ってH_KOJIN_IDから、ファイル書き出し用構造体outの項目KOJIN_IDに セットするときに、現状のままだと余った桁に0が入ってしまいます。 データセット部 sprintf(out.KOJIN_ID,"%11.11ld",H_KOJIN_ID); 余った桁に半角スペースが入るようなsprintf指定方法はありませんか?
401 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 14:41:57 ] >>399 もしかして複数ファイルに分けてる? スタティックライブラリの関数名がダブってるような気がする
402 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 14:44:55 ] >>400 いってる意味がよく分からないけど %11ld または %-11ld でいいのかな?
403 名前:デフォルトの名無しさん [2009/03/16(月) 16:44:14 ] 400です。 おかげさまで解決です。
404 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 16:54:03 ] おかげさまってマルチでよそで答えもらっただけだろ。
405 名前:デフォルトの名無しさん [2009/03/16(月) 20:22:15 ] std::cinで矢印キーの入力を取得することはできますか?
406 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 20:29:07 ] 質問です WM_NCHITTESTをフックしたいのですが SetWindowsHookEXの中のどの項目ならフックできるでしょうか?
407 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 22:16:04 ] >406 >The WM_NCHITTEST message is sent to a window when the cursor moves より、このメッセージは Send される。 従って WH_CALLWNDPROC か WH_CALLWNDPROCRET だが、いずれもメッセージを調べるだけで変更することはできない。 別途処理したいならサブクラス化とかが必要。
408 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 22:17:02 ] っつーか、Win32API質問箱の管轄だな。
409 名前:406 mailto:sage [2009/03/16(月) 22:53:13 ] >>407 ありがとうございます。 メッセージの変更ができなかった謎も解けました。
410 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 00:11:37 ] const stringのイテレーターってどうやって宣言するんでしょうか? std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>> でイテレーターを宣言すればうまくいくんですが、もっとスマートな書き方が知りたいです
411 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 00:13:31 ] >>410 #include <string>
412 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 00:15:06 ] >>411 #include <string>はちゃんとしてます
413 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 00:17:51 ] >>412 ならイテレータの宣言は済んでる。 何がしたいのかよくわからん。 std::string::const_iterator i; みたいにイテレータ型の 変数を宣言したいってこと?
414 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 00:19:17 ] あ、const_iteratorってやるんですね。解決しました。ありがとうございます
415 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 00:19:30 ] const stringのイテレータという言い方は無い。 stringのconst_iteratorならstd::string::const_iteratorで宣言できる。
416 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 17:14:42 ] newが失敗するのってメモリが足りない時以外にどんな状況が考えられますか?
417 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 17:27:57 ] 何をnewするかに拠る
418 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 17:42:35 ] コンストラクタがエラー投げてることもある
419 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 17:46:41 ] そもそもメモリが足りてなくても失敗するとは限らない。
420 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 18:52:06 ] STLの出す例外一覧みたいなのってありませんか?
421 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 19:54:38 ] これ格納すればあらゆる例外投げてくれるよ struct Hoge{ Hoge(){throw new MyFavoriteException;} };
422 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 16:14:20 ] そうかなあ
423 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 02:41:10 ] VC++でCGIを作ってます(ただの興味本位です HTMLの文字コードはUTF-8にしたいので、文字列リテラルの文字コードをUTF-8にするために、 ソースコードをUTF-8で保存して、コンパイルしました。 すると「現在のコードページで表示できない文字を含んでます。Unicode形式で保存してください。」という警告が出て、 更に文法エラーが出てきてコンパイルできませんでした。 ソースコードにBOM付けてコンパイルしたら成功しましたが、出力された文字列は何故かShift_JISになってました。(VC++が日本語版だから? 文字列にUTF-8を使うことは不可能なんですか?
424 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 03:11:19 ] ソースファイルの文字コードとプログラムの出力は別物 ソースはShift_JISでもUTF-8でもコンパイルすれば内容は同じ で、出力をUTF-8にするためにはプログラムで文字列を組み立ててから 最後にUTF-8に自力で変換してやらなくてはいけない UTF-8への変換はWin32APIを使う必要がある たぶんIMultiLanguage2のあたりつかえばできると思うので検索して調べてみてくれ あと、Shift_JIS以外の文字コードをstdoutに出力するなら、stdoutをバイナリモードに する必要があるような気がするので、fprintfとかfwriteの前に以下のようなコードが必要かも setmode( fileno(stdout), O_BINARY );
425 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 04:28:22 ] 2005以降なら、fopenなどでccs=UTF-8を付加すればいいのではと思う
426 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 12:00:07 ] あー、fopenなんてここ何年も使ってないからすっかり忘れてたわ
427 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 13:06:36 ] 環境依存しない方法で変換するにはどうすればよかろうの?
428 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 13:15:48 ] 無理 環境ごとに#ifdefしまくるのが精一杯
429 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 13:45:03 ] CGIやるならLinuxだろ >>425 stdoutには使えないよね
430 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 15:38:25 ] ソースが Shift_JIS なら、環境に依存してない。
431 名前:デフォルトの名無しさん [2009/03/20(金) 16:55:09 ] Visual Studioで画面に複数のソースを表示させる方法ってありますか? Source.cppとSource.hを横に並べて表示したいんですが、、
432 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 17:01:15 ] タブを右クリ→垂直タブグループの新規製作
433 名前:デフォルトの名無しさん [2009/03/20(金) 17:04:01 ] すごい、出来ました! ありがとうございました。
434 名前:デフォルトの名無しさん [2009/03/20(金) 23:07:02 ] page4.auctions.yahoo.co.jp/jp/auction/d91264064
435 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 13:22:55 ] opendialogを使うと ShellExeCuteを使いバッチファイルを起動すると パスが見つからなくなってしまいます。 opendialogを使わない状態でバッチファイルを起動すると大丈夫でした。 何かディレクトリを指定するようなコマンドがあったら教えてください。
436 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 14:24:00 ] chdir
437 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 14:42:32 ] 436>> バッチファイルのほうで探したら見つかりました ありがとうございます。
438 名前:デフォルトの名無しさん [2009/03/21(土) 20:56:55 ] Visual C++の質問なんですが、 新規プロジェクトを作成した後、ソリューションエクスプローラーでフォルダを追加して、そのフォルダの中に ソースファイルを追加しました。でも実際にはそのフォルダは作られてなくて、プロジェクトのフォルダのトップに 全部のファイルが存在してました。ソリューションエクスプローラーからフォルダを追加しては駄目だったので しょうか?
439 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 20:59:56 ] ファイルシステム上のフォルダとは別物だ。
440 名前:デフォルトの名無しさん [2009/03/21(土) 21:03:40 ] >>439 ええーそうなんですか、、、と思ってもう一回見てみたら追加されるのはフィルタになってました。 じゃあ、プロジェクト内にソースを入れておくフォルダを作るにはどうすればいいですか? ソースを追加するときに新規フォルダを作っても、ソリューションエクスプローラからは見えません でした。 フィルタって何の意味があるんだろう。。
441 名前:デフォルトの名無しさん [2009/03/21(土) 21:10:07 ] 自己レスです。 自分なりに考えてみたのですが、ソース追加時に新規フォルダーを作ってそちらにソースを追加した場合、 フィルターもあわせて設定すれば、やりたいことができそうです。 でも途中でフォルダ名を変更しようとすると面倒そうですが、、、。 プロジェクトのトップに全ファイルが置かれるのがいやなのですが、皆さんはどうされてますか?
442 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 21:21:54 ] hoge/srcフォルダにソースもヘッダもぶち込む
443 名前:デフォルトの名無しさん [2009/03/21(土) 21:51:18 ] >>442 ありがとうございます。なんか、そっちのほうがいいのかと思えてきました。 自分のプロジェクト内には、DaemonとCommandという2つのフォルダがあって、それぞれの中に PrintInfo.cppというのがあるのですが、ビルド時にPrintInfo.objというのが重なってるせいか、 リンクでエラーになります。(LNK2019とかLNK2001とか) 同じ名前のソースが1つのプロジェクト内にあると、フォルダをわけてもよくないのでしょうか? 何度もすいません。
444 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:13:52 ] image.space.rakuten.co.jp/lg01/91/0000075291/80/img97a425ffzik9zj.jpeg
445 名前:デフォルトの名無しさん [2009/03/21(土) 22:23:20 ] >>444 浦賀湾のあたり? 解決しました。 出力ファイルのオブジェクトファイル名を変更すればできました。 ただ、両方のPrintInfo.cppに対して、オブジェクトファイル名を手動で指定 しないとだめなのが、分かりにくかった。 片方だけ手動で変更すればいいんじゃないか、、と思ったんですが。 ありがとうございました。
446 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:33:42 ] >>444 テラナツカシス
447 名前:デフォルトの名無しさん [2009/03/22(日) 13:01:45 ] 昨日VSいれてみました。いきなり分りません。 System::Object^ の^ってなんですか
448 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:12:49 ] >>447 C++の入門書買ってくるか入門サイトを見て最低限の知識をつけろ
449 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:12:55 ] 検索すればわかることだと思うけれど、 www.google.com/search?hl=en&q=VC%2B%2B+%E3%82%AD%E3%83%A3%E3%83%AC%E3%83%83%E3%83%88&btnG=Search&lr=lang_ja の3番目
450 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:27:51 ] C++builderでTreeViewを使っているのですが、子を持つノードだけそのままの位置にして 他のノードのみをソートしたいのですが、alphasortだと全て並び変わってしまい うまくいきません。 何か良い方法があったら教えてください。
451 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:34:07 ] C++の入門書には載ってないだろうな。 C++/CLIの入門書嫁。
452 名前:デフォルトの名無しさん [2009/03/22(日) 13:54:28 ] CLIだったのか。どうりで。 ありがとね。
453 名前:デフォルトの名無しさん [2009/03/22(日) 15:29:42 ] int hoge(int n) { return n; } int hoge(const int n) { return n; } int hoge(int &n) { return n; } int hoge(const int &n) { return n; } だと、2番目だけコンパイルできないんですけど、どうしてなんでしょうか。 呼び出すときに、結局intを丸ごとコピーして引数に渡すので、呼び出し元では int であろうがconst int であろうが区別していないのでしょうか。
454 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 15:41:21 ] >>453 そう。関数引数の型としてはトップレベルの const は無視され、区別されない。 ただし定義においてはローカル変数への const と同様に働く。
455 名前:デフォルトの名無しさん [2009/03/22(日) 16:58:39 ] 暗号の本で一通りのアルゴリズムのようなものは理解したのですが、 Cに組み込むにはどうすればいいのでしょうか? アセンブリはやったことがないのですが、Cプログラムを逆アセンブルすると簡単にバレたりしませんか? たとえば全てのバイトにn加算するという暗号化を施す場合、 その加算するという処理、nという数値が逆アセンブルによって解ると思うのですが、 そうさせないために何か対策する必要はないのでしょうか?
456 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 17:04:17 ] アルゴリズムが判明して脆弱になるような暗号は、その時点で脆弱なのです。
457 名前:デフォルトの名無しさん [2009/03/22(日) 17:21:23 ] 例が悪かったですね。 AES等安全性の確立されたアルゴリズムを使うことを前提とします。 ある暗号化されたデータをプログラムで読み込み複合化する場合、プログラムコードに鍵を含める必要がありますよね。 その鍵は逆アセンブル等で簡単に解ったりしないんですか?
458 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 17:24:55 ] >>457 分かります AES暗号化を使っていることが分かるだけでも どこを調べればいいか分かってしまいます ある程度以上は諦めるしかないです
459 名前:デフォルトの名無しさん [2009/03/22(日) 18:09:08 ] MFCでアプリを作っているのですが、 動作確認のため、コンソールも起動しております。 _cprintf_sや_cscanf_s関数を使っているのですが、 _cscanf_s関数でバックスペースのキーを入力すると、 プログラムが無限ループで暴走してしまいます。 普通のscanf()関数のようにバックスペースで一つ前の文字を削除するには どうすればよいでしょうか?
460 名前:デフォルトの名無しさん [2009/03/22(日) 18:53:39 ] #include <iostream> int main(){return 0;} というプログラムなんですが、プロジェクトを新規作成するときに、 (1)最初から空のプロジェクト (2)Win32プロジェクトを選択して、空のプロジェクト という2つの方法でやると、(1)はコンパイルできるのですが、(2)だとコンパイルが 通らず、LNK2019というエラーになります。 この2つの方法って何が違うのでしょうか?
461 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 18:55:39 ] Win32プロジェクトはGUIプログラム用です
462 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 19:01:50 ] >>460 プロジェクトのプロパティをよく比較するとわかるが、いくつかの初期設定が異なっている。 そのエラーの元になっている違いはエントリポイントの違い。 Win32プロジェクトでは、main()の代わりにWinMain()という関数からプログラム開始する。 他にもコンソールが表示されるかとかプリプロセッサ定義とか諸々も違う。
463 名前:デフォルトの名無しさん [2009/03/22(日) 19:24:03 ] >>461-462 ありがとうです。 でもmainをWinMainに書き直しても駄目でした。 >他にもコンソールが表示されるかとかプリプロセッサ定義とか諸々も違う。 本当にほかにも色々違うんですね。
464 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 20:09:48 ] #include <windows.h> int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {return 0} これが一応の最小プログラムね Windowsプログラミングでは初めて見る型がたくさん出てくるけど ほとんどtypedefしただけだから、惑わされずに命名規則と元の型を覚えるといいよ
465 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 20:15:12 ] >>464 何のためのtypedefだよ…
466 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 20:23:08 ] typedef元の型が変化しても書き直す必要をなくすため
467 名前:デフォルトの名無しさん [2009/03/22(日) 20:26:11 ] 個人的にはAPIENTRYの方が好きだなあ
468 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 22:28:20 ] 可読性のためだろ
469 名前:デフォルトの名無しさん [2009/03/23(月) 00:16:56 ] memcpy.asmの mov [edi],al ;U - write second byte to destination でエラーが発生してしまいます。なぜでしょうか? 以下 プログラムです。 class ErrorDiffusion{ public: ErrorDiffusion(int campussize); ~ErrorDiffusion(); void Upperandlowerreversing(int width,int height,unsigned char *Grey); private: unsigned char *Output; }; //上下反転 void ErrorDiffusion::Upperandlowerreversing(int width,int height,unsigned char *Grey) { int i,flag=1; printf("上下反転\n"); for(i=0;i<height;i++) { //printf("memcpy mae\n"); memcpy(&OutPut[(height-flag)*width],&Grey[i*width],width); //printf("%d loop\n",i); flag++; } } //ここで関数を呼んでいます。 errordiffusion.Upperandlowerreversing(width,height,&Grey[0]);
470 名前:デフォルトの名無しさん [2009/03/23(月) 00:47:52 ] private: unsigned char *Output; にして、コンストラクタで、メモリを確保していて NULLにはなっていないのですが・・。privateへのアクセスは、普通に Outputでいいはずだとおもうのですが違うのかな?
471 名前:デフォルトの名無しさん [2009/03/23(月) 01:09:47 ] 自己解決しまsちあ
472 名前:デフォルトの名無しさん [2009/03/23(月) 09:55:51 ] ifstream ifs(filename, ifstream::binary); Windows環境で、Ifstreamの読みこみで、Ifstream::binaryを書かなかったら どうしてだめなのでしょうか?
473 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 10:16:20 ] テキストファイルの読み込みとか、書かなくてもいい場合があるじゃん。 Cの"r" "rb" と同じ関係。
474 名前:デフォルトの名無しさん [2009/03/23(月) 10:58:52 ] >>473 ありがとうです。テキストファイルの読み込みの場合は書かなくていいんですね。 ついでにあと1個質問させてください。 Ifstream.seekg()で、 Ifstream.seekg(0,ifstream::end) Ifstream.seekg(ifstream::end) はどうちがいますか?どっちもコンパイルできるし、意味も同じっぽいんですけど、、、
475 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 11:02:37 ] >>474 省略時はどの値を渡したのと同じってのを意識するといい。
476 名前:デフォルトの名無しさん [2009/03/23(月) 11:36:04 ] >>475 なるほど。 省略時は0を渡したのと同じですね。
477 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 11:46:00 ] 念のため書くけど、省略時にどの値を採用するかはその関数を書いた人が決めるのよ。 さっきのIfstream::binaryも同じ
478 名前:デフォルトの名無しさん [2009/03/23(月) 12:35:15 ] >>477 本当ですね。 VC9++で試したら、ゼロじゃなかったです。 どういう値になっているのか調べられなかったけど、 ちゃんと読めてなかったです。
479 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 12:50:29 ] ああそうか、binary modeとcooked modeはCP/M、ひいてはMS-DOSの ためにC言語時代から受け継いでいる伝統だったな unix系は意識不要
480 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 14:42:51 ] おまえFTPとか知らないだろ
481 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 14:54:43 ] File Transfer Proturk がどうかなさいましたか?
482 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 15:09:04 ] TDateTime now = Date(); String hiduke=DateTimeToStr(now); SaveDialog1->FileName=hiduke; 日付をFileNameのところに表示したいのですが、上記のようにやっても うまくいきません原因の分かる方教えてくださいー。
483 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 15:39:00 ] 482です 解決しました 2009/03/23の /がダメだったようです。
484 名前:デフォルトの名無しさん [2009/03/23(月) 22:00:05 ] free(array); すると、プログラムが止まってしまいます。 メモリは確保しているし、なぜfreeするとエラーになるかわからないです メモリのエラーはerrorno でチェックしろとかいてあったのですが どうやってチェックすればいいかサンプルコードをください
485 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 22:07:14 ] エスパーさんたのみます!
486 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 22:13:31 ] 間違えたアドレスを開放しようとしてる
487 名前:高橋 [2009/03/23(月) 22:15:23 ] >>485 情報がこれだけじゃ、いかに魔美くんでも無理だよ。
488 名前:Cの達人 mailto:sage [2009/03/23(月) 22:27:56 ] Cの達人と申します。 ネイティブCのことなら、お任せください。 by Cの達人
489 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 22:29:38 ] www.kouno.jp/home/c_faq/c7.html#19
490 名前:デフォルトの名無しさん [2009/03/23(月) 22:35:46 ] TCPで他のマシンから要求を受け付けるサーバーを書いてるのですが、過去の一定の時間内(例えば1時間)で処理した 要求の上限を設定(例えば100個まで)して、それ以上は処理しない(要求を受け付けるだけ)ようにしたいと思ってます。 そこで、受け付けた全要求の{受け付けた時間、処理が終わった時間}という構造体を作って、それをダブルリンク リストにつないで置くようにしました。新しい要求が来たらそのダブルリンクを回って、処理が終わってから1時間 たってないものの数をカウントして、処理する/しないを決めます。 ところがこれだと要求の数が増えると(10万件とか50万件とか)、どんどん重くなるのですが、何か良い方法はない でしょうか?こういう処理って結構色々な場面で使われると思うのですが。 よろしくお願いします。
491 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 22:38:48 ] 10万とかのオーダーになったら、DB 使うことを考えちゃうな。
492 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 22:43:43 ] >>490 deque を使ってみるといいよ 新しい要求がきたときに 1.一番古い [0] の時刻が1時間より前だったら pop_front で削除 2.1.で削除が行われた場合1.に戻る 3.deque のサイズが 100 未満であれば要求を受け付ける 4.deque に push_back で追加 最近同じような質問があった気がする
493 名前:デフォルトの名無しさん [2009/03/23(月) 22:50:42 ] >>491 DB使ったほうがいいですかね。 出来るだけ軽い処理で実装しろと言われてて、自分はCで実装してるのですが、、、 上限を過ぎた要求は拒否しちゃえばいいのかな、、。でも拒否された方にいつ リトライすればいいか教えるのも面倒だし。一応、受け付けた要求の数があまり 多くなりすぎた時には拒否できるようなオプションも付けようかとは思ってます。 リトライのタイミングは相手まかせです。 ありがとうございます。
494 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 22:56:09 ] C++には便利な仕組みがいっぱいあるよねー。
495 名前:デフォルトの名無しさん [2009/03/23(月) 22:57:02 ] >>492 ありがとうございます。 dequeも考えたのですが、処理中の要求がどういう順序で終わるかは決まってないので (重い要求の少し後に軽いのが来た場合、後から来た軽いのが先に処理が終わる可能性があります) dequeは使えないか、と思ったんですが、どうですか? >最近同じような質問があった気がする ありがとうございます。探してみます。
496 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 23:09:23 ] 処理中のものは一時的に別のmapとかに保存しておいて、処理が終了したらlistに積むとか
497 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 23:09:26 ] 処理の軽さがあらかじめわかるなら あの、あれ、なんていったっけ、常にソートされるコンテナ、 それ。
498 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 23:21:09 ] 時刻をキーにしてstd::set使えばよさげだね 重さ?シラネ
499 名前:デフォルトの名無しさん [2009/03/23(月) 23:35:58 ] どうも自分の環境だと、30万件を越えたあたりからマシンが応答なくなります。 30万件のダブルリンクを、全然内容に変化がないのに1秒とかの間に何度も何度も 回ってて、何度も何度も処理後1時間以内のエントリの数を数えてます。 この処理を減らせれば、もっといけそうな気がする。 メモリ消費自体は、構造体が16バイトなので、100万件でも16MBとかの消費のはず なんですがね、、、
500 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 23:41:11 ] それは「新しい要求が1秒とかの間に何度も何度も」来てるからじゃろ? そして「受け付けた全要求」、つまりここでは30万件を 要求が来るたびに「回って、処理が終わってから1時間たってないものの数をカウントして」る からじゃろ? 仕様どおりじゃないのかな?
501 名前:デフォルトの名無しさん [2009/03/23(月) 23:48:29 ] >>500 そうですね。 負荷テストやっとこうと思って、別プロセスからガンガン要求なげてみたんです。 1秒間に10000件とかです。負荷が高いときは要求を拒否しますといったほうがいいんですかね。 そうなると、要求を出す側のプログラムも変更しなくちゃいけないのがいやなんですけどね。。
502 名前:デフォルトの名無しさん [2009/03/23(月) 23:52:40 ] >>497-498 ありがとうございます。 でもC++は手元のコンパイラが対応してなくてですね、、強く要求すれば購入してもらえるかも しれないんですが、なんとかCでやりたいと思ってます。 自分でstd::setとかコンテナとか実装すればいいのかもしれないですが、 常にソートされるコンテナって重そうな感じがするし、、、、
503 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 23:53:31 ] 全体的に仕様がおかしい気がするけど そういう仕様なら仕方ないのであきらめましょう。 プログラマは仕様について意見することはできても 仕様を変える力はありません。しようがないのです。なんちて・・・ コマネチ!
504 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 00:08:07 ] >>501 それは仕事でやってるの?
505 名前:デフォルトの名無しさん [2009/03/24(火) 00:11:58 ] >>501 そうです。でも売り物じゃなくて、社内のデータ管理ソフト用の処理を書かされてます。
506 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 00:22:25 ] すげー社内システムだな。
507 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 00:27:16 ] >>492 の方法なら一番軽いと思うんだけどな。処理が終了してからlistとかdequeに積めばいいだけだし。 全探索の力業を少しでも軽くしたいなら要求が来るたびに調べるんじゃなくて、少しの誤差を許容して 調べるのは一秒に1回までとすれば1/10000まで軽くなると思う。
508 名前:デフォルトの名無しさん [2009/03/24(火) 00:30:19 ] 結構大きな会社で、ストレージ管理ソフトも自社製のがあるんですが、 そういうのは管理できる人を手配するのが大変らしいです、、、
509 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 00:30:50 ] STLは偉大だなぁ。ちゃんと処理時間についても言及されてる。
510 名前:デフォルトの名無しさん [2009/03/24(火) 00:40:32 ] >>507 そうですね。 じゃあ、ダブルリンクには処理が終了してないものを入れておくことにして、終了したものは dequeで管理する、そしてダブルリンクの全探索は1秒に1回にしてやります。 過去1時間以内に処理した要求の数は、ダブルリンク上の処理中のものの数+deque上のもの。 これで実装してみます。 明日の朝までにできるかな。
511 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 00:41:40 ] STLは元々Adaに組み込もうと研究されてたようですね C++にtemplate機能が付け加えられたのに目を付けた Stephanov(だっけ)がC++に移植したのが初めだとか
512 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 07:02:35 ] template に関してだけど、オーバーロードにするか、templateを書くかといつも 使いどころに迷ってしまう、皆さんはどういう基準で使い分けていますか?
513 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 07:23:59 ] オーバーロードで済むならオーバーロード。 テンプレートが必要な時だけテンプレート。
514 名前:デフォルトの名無しさん [2009/03/24(火) 08:09:13 ] 時間がないとき以外は全部テンプレート。自分が成長するため。
515 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 08:30:05 ] 演算子のオーバーロードについて質問があります。STLのIteratorみたいに、 List<int> *list = new List<int>(); llist.push_back(1); llist.push_back(2); for(Iterator* iter = (ListIterator<int>*)list->iterator(); iter->hasNext(); iter++){ printf("%d ", (*iter)); } このような書き方ができるようにソースコードを書きたいのですがうまくいきません。 以下が(全部載せるには少し長いので)自分のソースの抜粋です。 class Iterator{ public: //省略 virtual bool hasNext() = 0; virtual Iterator<Type> &next() = 0; virtual Iterator<Type> &operator++() = 0; virtual Type& operator*() = 0; }; template <class Type> class ListIterator : Iterator<Type>{ public: //省略 Iterator<Type>& operator++ (int dummy){ return next();: } Type& operator*(){ return value;//現在イテレータが指しているセルの内容 } } このように定義したものを上のように実行すると、4227856のような数字が連続して表示されてしまいます。また、for文のところで実行時エラーが出ます。 どう書き直せばよいでしょうか……。 (素直にSTL使えって話なんですがね……OTL)
516 名前:デフォルトの名無しさん [2009/03/24(火) 08:41:56 ] >>515 よく1回のカキコにおさめたな。
517 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 08:48:26 ] >>516 載せるところ選ぶのに苦労しました……。 重要そうなところだけ抜粋してます。 テンプレートクラスのListは自前で教科書読みながら基本的な機能は実装してみました。 こんなことしてるのは、単に興味とステップアップのためなんですが。 ちなみに学生ではありますが、ただの(へたれ)日曜?プログラマです。 サンプルコードまねるだけでろくなソフトも作れませんが……OTL (っとこんなことはどうでもいいですよね……)
518 名前:デフォルトの名無しさん [2009/03/24(火) 10:05:31 ] あるサイトを参考にして、下記のような半角全角変換関数を 作成したのですが、試しに適当にint型の変数を入れて 動かそうとすると下記のようなエラーが出ます。 参考サイトにあるものをほぼそのまま使用しており、 修正したところはcase文の中の変換する文字のみです。 参考サイトには、そのまま使用できるようなことが 書いてあったのですが、何が間違っているのか教えてください。
519 名前:デフォルトの名無しさん [2009/03/24(火) 10:06:52 ] int han2zen(char *str) { char *buf, *p, *ptr; buf=(char *)calloc(strlen(str)*2+1,sizeof(char)); for(ptr=str,p=buf; *ptr!='0\'; *ptr++){ switch((int)*ptr){ case '0': strcpy(p,"0");p+=2;break; case '1': strcpy(p,"1");p+=2;break; case '2': strcpy(p,"2");p+=2;break; case '3': strcpy(p,"3");p+=2;break; case '4': strcpy(p,"4");p+=2;break; case '5': strcpy(p,"5");p+=2;break; case '6': strcpy(p,"6");p+=2;break; case '7': strcpy(p,"7");p+=2;break; case '8': strcpy(p,"8");p+=2;break; case '9': strcpy(p,"9");p+=2;break; case default: *p=*ptr; p++; *p='\0'; break; } } strcpy(str,buf); free(buf); return(0);
520 名前:デフォルトの名無しさん [2009/03/24(火) 10:07:57 ] (1849) : error C2001: 定数が 2 行目に続いています。 (1849) : error C2015: 定数の文字数が多すぎます。 (1850) : error C2143: 構文エラー : ';' が 'switch' の前にありません。 (1850) : error C2143: 構文エラー : ')' が 'switch' の前にありません。 (1861) : error C2059: 構文エラー : 'default' (1868) : error C2040: 'strcpy' : 'int ()' は 'char *(char *,const char *)' と間接操作のレベルが異なります。 (1869) : error C2371: 'free' : 再定義されています。異なる基本型です。 C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\\include\malloc.h(123) : 'free' の宣言を確認してください。 (1871) : error C2059: 構文エラー : 'return' (1872) : error C2059: 構文エラー : '}'
521 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 10:10:37 ] >>515 printf("%d ", (**iter)); 正直混乱するのでiteratorで多態はやめた方がいいんじゃない? Listの実装でListIteratorを返すようにして for(ListIterator iter = list->iterator(); iter->hasNext(); iter++){ printf("%d ", (*iter)); }
522 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 11:12:35 ] >>519 '0\' '\0' case default: default;
523 名前:515 mailto:sage [2009/03/24(火) 12:20:00 ] >>521 レスありがとうございます。 >printf("%d ", (**iter) なんでうまくいかないんだろうと4時間くらい混乱してました。 List::iterator()でnewしてポインタを返す仕様でした……(もちろん管理してdeleteもする)。 とりあえず一つ前のソースコードは(**iter)で動きました! どうもです。 ポインタ渡してるんだから*が一個多く必要なのは当然。初歩的なミスだったとは恥ずかしい。 初めて演算子のオーバーロードなんてやるからそれが間違ってるのかと思い込んでました。 List::iterator()は、 ListIterator<Type> iterator(){ return ListIterator<Type>(this); } 現在のソースコードはポインタじゃなくてこんな感じにしてみました。 >多態はやめたほうが…… Iteratorクラスを作って継承するのはやめる方向で書き直してみます。どうせ自分しか使わないですし。 アドバイスありがとうございました。 スレ汚し失礼しました。
524 名前:デフォルトの名無しさん [2009/03/24(火) 13:59:10 ] 518,519,520です。 ありがとうございます。 おかげで動くようにはなったのですが、 期待する値を得ることができません。 下記のような値が返ってきてしまいます。 何がいけないんでしょうか? INPUT OUTPUT HAN2ZEN("9") NULL HAN2ZEN("99") 結果なし HAN2ZEN("999") 9 HAN2ZEN("9999") 結果なし HAN2ZEN("99999") 9 HAN2ZEN("999999") 99 HAN2ZEN("9999999") 999 HAN2ZEN("99999999") 99 HAN2ZEN("999999999") 999 HAN2ZEN("9999999999") 9999
525 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 14:24:58 ] >>524 int main() { char s[100]; for (int i = 1; i <= 10; i++) { s[0] = '\0'; for (int j = 0; j < i; j++) { strcat(s, "9"); } printf("HAN2ZEN(\"%s\")", s); han2zen(s); printf("%s\n", s); } return 0; } これでちゃんと出たけどな?
526 名前:デフォルトの名無しさん [2009/03/24(火) 14:43:54 ] ありがとうございました。han2zen関数の使用方法を間違って、 例えばprintf("%s\n", han2zen(s));のように使用していたため 変な値が返ってきていただけでした。助かりました。
527 名前:デフォルトの名無しさん [2009/03/24(火) 16:19:10 ] VS2005を使っているのですが、iostreamをインクルードすると error C2913:明示的な特殊化; 'std:iterator_traits'はクラス テンプレートの特殊化ではありません。 をはじめ100以上のエラーがでます。 xutilityというファイルが原因のようですが、特に書き換え等行っていません。 プログラムは別のPC(同じOS、同じVS)に移すとエラーを吐きません。 アドバイスを御願いします。
528 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 16:37:17 ] VSを入れ直す
529 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 17:06:31 ] ところで、 C言語のスレッド関係の関数をC++のクラスでとりあえずラップ・カプセル化っぽくした簡単な自作ソースコードがあるんですけど、 需要ありますか? 機能はかなり限定されてますけど、Windows(ほぼWin32 APIのみのVC++)用、確かLinux用(pthread。簡素です)と両方あります。 これ見られたら、ダメ出しをたくさんくらいそうだけど。
530 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 18:13:44 ] 需要ありますか?じゃなくて ダメ出しして欲しいんで見てくれませんか?だろ boost::threadがあるしな
531 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 18:16:28 ] >>530 だよな いらないよな
532 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 18:20:01 ] えー。マルチスレッドなprintfとか欲しいよ。 文字単位でスレッド分割して最終的に正しいストリームを形成するみたいな。 どう?
533 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 18:21:22 ] >>529 最近ねたが無いからうpれ
534 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 18:40:22 ] 土下座して頼むならうpってあげてもいいんですが。
535 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 19:05:54 ] >>530 ,531,533 それが本音で、ネタのためにも、うpしたかったと>>529 が申しております。 よかったら見てやってくださいとのこと。 多分、これだ。 ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8998.zip
536 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 20:31:51 ] >>535 このスレ見るものが、怪しげなzipファイルを踏むとは思えないんだけど
537 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 20:44:13 ] オレは踏んだ そしてどちらかの環境(Win,Linux)しか使わないなら必要ないと判断した
538 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 20:59:44 ] svg形式を解析・出力するようなオープンなライブラリないのかな なけりゃ自力で作るんだが・・・完全準拠って大変だな・・・ 改めてブラウザって大変なんだなって思うわ
539 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 21:13:22 ] ないわけないやろが
540 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 00:34:19 ] >>538 オープンの意味による。 GPLならいっぱいあるが、Non-GPLでC/C++から使えるオープンソース実装は多分ないと思う。 ていうかあるなら俺に教えてくれ。 OpenVGもNon-GPLで非プロプライエタリな実装が見あたらないんだよ。 リファレンス実装をGPLで配布するとかマジやめて欲しい。
541 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 00:42:20 ] ハノイの塔を解くプログラムを書いたのですが、結果が正しいのかわかりません。 どなたか検証していただけないでしょうか? ↓ソース kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8999.c ちなみに、円盤の個数が5までなら正しいのを確認してます。
542 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 01:14:36 ] 5個まで正しいなら、6個目も正しいのは簡単にわかるよ。 なぜなら、6個目の解法は 5個目までの解法+一番下を動かす+5個目までの解法(ただし最初とは使う柱が違う) だから。 ちなみに7個目の解法は 6個目までの解法+一番下を動かす+6個目までの解法(ただし最初とは使う柱が違う) 以下同様。ハノイは簡単。
543 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 01:19:59 ] >>541 危なっかしい警告が出てるので、まず潰したほうがいい。 結果はこれと比べとき。 #include <stdio.h> int Solve(int num, int step, int from, int to, int tmp) { if (num) { step = Solve(num-1, step, from, tmp, to); printf("%d 手目: %d -> %d\n", step++, from, to); step = Solve(num-1, step, tmp, to, from); } return step; } int main(void) { int num; printf("円盤の個数を入力して下さい: "); scanf("%d", &num); Solve(num, 1, 0, 2, 1); return 0; }
544 名前:デフォルトの名無しさん [2009/03/25(水) 08:23:34 ] for (list<int>::iterator i = lists.begin(); i != lists.end(); ++i) { if (iが何かの条件を満たしているとき) lists.erase(i); } とやれば、リストをたどって、条件を満たしている要素全部を消していくことができますか?
545 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 08:46:11 ] remove_if
546 名前:デフォルトの名無しさん [2009/03/25(水) 09:02:16 ] RemoveとEraseはなにが違うんですか?
547 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 10:27:35 ] >>546 あなたのお使いのライブラリの仕様によります。 STLについてなら、RemoveもEraseもありませんのでremove, eraseのことだと思いますのでそれについては以下に。 removeは対象の要素が指定したキーと一致した場合のみ削除しますが、eraseは一致を確認することなく削除します。 但し、removeは対象となるコンテナがlistの場合のみ使用できます。 尚、algorythmにあるremoveは、対象要素を移動しますがメモリの後始末はしないので注意が必要です。
548 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 10:34:29 ] >>541 円盤の番号を上から1〜n、手順を1から数えるとして、手順mに動かす円盤は手順mを 二進表現したときの最初の1が下から数えて何番目に出現するか数えればいい。 例えば、100手目に動かす円盤を知るには先ず100の二進表現を得ればいい。 これが110100なので、下から3番目が1と判る。つまり、上から3番目の円盤を動かすと知れる。 要は、再帰は必須ではない。
549 名前:デフォルトの名無しさん [2009/03/25(水) 12:19:05 ] >>547 ありがとうございます。VC++9を使ってます。 listの中を1周しながら、条件に合うものをerase()しているのですが、1周する途中で デバッグエラーに引っかかります。何が間違ってるのでしょうか?
550 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 12:26:29 ] 要素の追加、削除した後のiteratorって保障されないんじゃないの? remove_ifとかした後で、いらない要素をまとめてeraseすればいいんじゃないだろうか
551 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 12:35:17 ] >>544 erase() に渡されたイテレータは無効にり、無効なイテレータは インクリメントできない(未定義動作になる)。 www.google.co.jp/search?q=%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF+%E7%84%A1%E5%8A%B9
552 名前:541 mailto:sage [2009/03/25(水) 17:06:53 ] お礼が遅くなってすみません。 大丈夫みたいですね。どうもありがとうございました。
553 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 17:32:34 ] list< int >::iterator i = lists.begin(); while ( i != lists.end() ) { i = lists.erase( i ); // erase()は削除した要素の次の要素を指すイテレータを返す } こんなかな。っていうか、STLでは自前のループはなるべく書かない。
554 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 17:54:06 ] C++で変数(例えばdouble型)に#INFを代入する方法はないでしょうか? 出来れば環境依存しない方法を探しています。
555 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 17:59:03 ] 依存無しは無理だろ 浮動小数にIEEE754を使うことが定められてるわけじゃないから INFなんてものが存在するとは限らないし
556 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 18:40:44 ] >>554 std::numeric_limits<double> infinity() 存在するかどうかのテストも用意されてたはず。
557 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 18:41:42 ] >>554 環境依存だろうけど x=1e+1000;
558 名前:デフォルトの名無しさん [2009/03/25(水) 21:59:14 ] Windows(Vistaです)のC++でsleep(秒)を使おうと思っているのですが、どのヘッダを インクルードすればよいのかわかりません。結局 #include <windows.h> をインクルードして、 Sleep(ミリ秒); を使ってますが、Windowsでsleep()はつかえるのでしょうか?
559 名前:sage [2009/03/25(水) 21:59:39 ] すみません。古い技術で恐縮ですが、 VB6用のDLLをVC++で作成するとき、 VB6で使用するタイプライブラリはどのように作成するのでしょうか?
560 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 22:21:08 ] >>558 それしかありません
561 名前:デフォルトの名無しさん [2009/03/25(水) 22:53:14 ] >>560 わかりました。 ありがとうございます。
562 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 00:48:06 ] VC6.0でビットマップAの特定座標にビットマップBをコピーして、 それらを一切表示せずにビットマップCとして保存したいのですが、 BitBltという関数を用いれば可能なのでしょうか?
563 名前:デフォルトの名無しさん [2009/03/26(木) 01:26:02 ] C++で、名前なし名前空間に関数を書いた場合とただのスタティック関数は、機能面から 考えたら同じと思っていいですか? そのファイル内からだけ使えるという点で。
564 名前:デフォルトの名無しさん [2009/03/26(木) 01:37:41 ] おい、誰か答えろや。 答えんかい!
565 名前:デフォルトの名無しさん [2009/03/26(木) 02:43:02 ] 関数使わなくても 座標計算してあとは合成すればいい まああれだ
566 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 03:26:22 ] >>564 ちょっとだけ違う
567 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 03:54:26 ] そのへんは週刊 名前空間・創刊号に詳しく載ってるから買ってくるといい 確か初回は特製boost::binderがついてくるはず
568 名前:デフォルトの名無しさん [2009/03/26(木) 05:27:59 ] >>566-567 ほんとに役に立たないスレだな。 もっとちゃんと答えろ。 こっちは眠いのを我慢してレス待ってんだから。 早くしてくれや。
569 名前:デフォルトの名無しさん [2009/03/26(木) 06:28:20 ] あー眠い眠い。早く教えてくれ。寝ちまうぞ。
570 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 06:55:12 ] いいよ。
571 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 06:57:10 ] おやすみー
572 名前:デフォルトの名無しさん [2009/03/26(木) 07:04:18 ] >>570-571 はやく助けろや。 こっちは急いでんだわ。
573 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 07:15:17 ] おぅ。わかった。すぐに答えるからちょっと待ってろ
574 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 07:21:27 ] >>563 リンケージが違う。といっても、どのみちファイル外からはアクセスできないんで あまり実用上の違いはない。 「リンケージが違う」ことを意識して、わざと違いの出るサンプルを作るとこんな感じ。 他にもあるかもしれないけどね。 template<void (*)()> int t() { return 0; } namespace { void an() {} } static void st() {} int main() { return t<an>(); } // t<st> はコンパイルエラー
575 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 07:28:56 ] もっとわかりやすく説明しろよカスども
576 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 08:39:31 ] あたまだいじょうぶでちゅかあ? ことばわかりまちゅかあ?
577 名前:デフォルトの名無しさん [2009/03/26(木) 08:44:02 ] わからないでちゅ・・・
578 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 08:56:46 ] 意味もなく盛り上げてんじゃね〜よ
579 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 09:10:06 ] >>574 ダメだよこういう時は嘘を教えなきゃ。
580 名前:デフォルトの名無しさん [2009/03/26(木) 09:47:06 ] 浅く寝ちまったよ。 >>574 ありがとョ。でもVC++2008だと、t<st>でもt<an>でも両方とも コンパイルできたけど?ほかの環境でも試したほうがいいのかな? >>579 うるせーやつだな。
581 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 11:50:38 ] >>580 > ほかの環境でも試したほうがいいのかな? 試さなくていいよ。
582 名前:デフォルトの名無しさん [2009/03/26(木) 12:45:35 ] >>581 そうか、まあまずリンケージから理解するかと思って調べたらこんなの出てきたんだけど、 ほんとかどうかついでに教えてよ。 C 言語と C++ 言語では const キーワードを使うことで定数を宣言することができます。 例えば const int cardmax=13; のように使用できます。これが単一のモジュールだけで 使われるのならば問題がないのですが、複数のモジュールにわたって使われる場合、 C言語と C++ 言語では constのリンケージが違うので、注意が必要です。具体的には C言語では外部リンケージをもち、C++ 言語では内部リンケージを持ちます。つまり C 言語では他のモジュールから使用する場合、そのモジュール内で extern const int cardmax; と宣言すればこの定数は使用可能ですが、C++ 言語では同じようにしても参照する ことはできません。C++ 言語で外部から const オブジェクトを参照したい場合には、 定数を定義するときに、 extern const int cardmax=13; のように定義する必要があります。
583 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 12:49:13 ] >>582 正しいよ。 ちなみにCでconstで内部リンケージを持たせるなら static const cardmax=13; ってやる。
584 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 15:14:19 ] >>580 へぇ VC++ だと通るのか。独自拡張じゃないかな? /Za でエラーになるかも。 ちなみに Cygwin の gcc 3.4.4 ではこんなエラーになる。 : In function `int main()': :4: error: `st' is not a valid template argument :4: error: no matching function for call to `t()'
585 名前:デフォルトの名無しさん [2009/03/26(木) 22:18:37 ] >>584 /Zaのつけ方を教えて。
586 名前:デフォルトの名無しさん [2009/03/26(木) 22:36:10 ] >>585 つけ方がわかったんで、つけてもう一回コンパイルしてみたけど、それでも 結果は同じ。どっちでも通るけどな。
587 名前:デフォルトの名無しさん [2009/03/27(金) 02:07:55 ] まったくお前らのせいで昼夜逆転しちゃったよ。 はやく解クレや。 今はカップ麺にお湯入れたんで、完成待ち。 やっぱ夜はいいな、静かでな。
588 名前:デフォルトの名無しさん [2009/03/27(金) 13:02:08 ] なんかカキコが減っちゃったな。 俺のせいかな。 悪かったよ。もう消えるわ。 じゃあな。
589 名前:デフォルトの名無しさん [2009/03/27(金) 23:33:13 ] なんか難しい方のスレで聞いちゃったみたいだからこっちで聞きなおしますね。 それにしても初心者スレって沢山あってどこで聞けばいいか良く解らないけどここにする。 C言語は上から順番に処理されるんだよね。 そうすると、割り込むみたいなことは許されないんだよね? 例えばfor文のループ中にキーを押したらそのときのtimeを取れるみたいなのは無理? for( ) ・・・・・・・・・ if(getchar 見たいなのじゃなくて、for文でゲームみたいなの動かしたいんだけど、 その途中でどんな途中でもtimeが取れるみたいなことは出来ないですか?
590 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 23:50:42 ] >>589 _beginthreadex
591 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 00:04:52 ] つ _kbhit()
592 名前:589 [2009/03/28(土) 01:09:16 ] ありがとうございます。
593 名前:デフォルトの名無しさん [2009/03/28(土) 05:28:17 ] >>589 スレッドを作るんだよ。2つのスレッドを作ってそれぞれにHello world出力 させてみろ。話はそれからだ。 あとは環境を書けや。WindowsかLinuxか。
594 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 07:06:38 ] スレッド信者ウゼ
595 名前:デフォルトの名無しさん [2009/03/28(土) 07:30:11 ] >>594 信者もなにも、基本だろ。 クソな書き込みするくれーなら、意味のあること書いてミロ。
596 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 07:57:08 ] _kbhit()にしてもどんなタイミングでも実行させるならマルチスレッドでやるしかないだろう
597 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 08:19:14 ] USBから自作した機器の制御とかをやりたいと思い、Windowsのドライバのプログラミング について勉強しようと調べてたんですが、ググっても本の通販ページばかり出てきて 何が必要なのか、どのようにして作るのかがまったく分かりません。 どこか基本的なところから作り方解説してくれてるサイトありませんか? 本買えと言われるかもしれかいけど、本買うかはドライバ開発ってどんな感じなのか 知って、本当にやってみようか考えてから買いたいんです。
598 名前:デフォルトの名無しさん [2009/03/28(土) 08:26:05 ] めちゃくちゃ環境依存(処理系依存)の問題だと思うので、こちらで質問です。 下記のように、CHogeHogeのクラス変数を初期化するのに、別のシングルトンクラス(CHoge)のメソッドの 戻り値を与えるコードを書いたところ、CHogeHogeのクラス変数を初期化するタイミングではまだCHogeが 生成されておらず、落ちます。コメント内のコードもうまくいきそうですがNGです 恐らくリンクオプションとか、pragmaで逃げられそうに思うのですが 対策方法を教えてください。処理系はVC6 SP5です 「CHogeHoge.cpp」 CHogeHoge* CHogeHoge::s_pInstance = new CHogeHoge(); // static CHogeHoge* CHogeHoge::GetInstance() { return s_pInstance; } int CHogeHoge::GetValue() { return m_Value; } /* -- これもNG CHogeHoge CHogeHoge::s_Instance; // static CHogeHoge* CHogeHoge::GetInstance() { return &s_Instance; } */ 「CHoge.cpp」 const int CHoge::STATIC_VALUE = CHogeHoge::GetInstance()->GetValue(); なお、GetInstance内でnewすれば問題解決するとは思いますが、それ以外の方法でお願いします。
599 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 08:32:03 ] >>598 言ってることと書いていることが違う気がするのは気の所為か? 私にはCHogeクラスの変数をCHogeHogeクラスのメンバ関数で初期化しているように見えるのだが。 つーか、設計を見直すと言う選択肢はないのだろうか。
600 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 08:46:03 ] CHogeの実装をCHogeHoge.cppに入れればいいんじゃね?
601 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 08:51:34 ] class CHoge { CHoge & instance() { static CHoge h; return h; } }; void CHogeHoge::init() { m_Value = CHoge::instance().value; }
602 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 09:05:29 ] >>596 入力反応に対応出来る範囲をうまく見積ればどうとでもなる for(){ int i = 0; l_c: switch(_kbhit()?0:++i){ case 0: printf("time");goto lc; case 1: ~;goto lc; case 2: ~;goto lc; default: }}
603 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 09:27:12 ] >>597 ググった結果から microsoft のサイトのものを見るといい
604 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 10:10:15 ] >598 >なお、GetInstance内でnewすれば問題解決するとは思いますが、それ以外の方法でお願いします。 なんでそれだと駄目なん? >めちゃくちゃ環境依存(処理系依存)の問題だと思うので、こちらで質問です。 問題そのものは静的オブジェクトの初期化順序問題として割と有名。 ttp://www.parashift.com/c++-faq-lite/ctors.html#faq-10.13 >601 みたいに関数内 static にするのも駄目?
605 名前:598 mailto:sage [2009/03/28(土) 12:22:45 ] >601さんの方法でうまくいきました。 しかもインスタンス保持用の変数は、クラス変数である必要すらないってことで、シンプルなので、 今後シングルトンはこの方法を愛用することになりそうです。 >604さん 有名な問題なのですね、勉強になります。 >>なお、GetInstance内でnewすれば問題解決するとは思いますが、それ以外の方法でお願いします。 >なんでそれだと駄目なん? 出来るだけシンプルにしたかったのと、 正攻法の攻略法を知っておこうと思ったからです。 ありがとうございました。
606 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 13:44:42 ] >>605 > 正攻法の攻略法を知っておこうと思ったからです。 わかってないから質問してるんだろうに、 正攻法で無いと決め付けてるのは何で?
607 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 16:26:26 ] >606 私の設計意図から外れるから。 ja.wikipedia.org/wiki/Singleton_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3 のJavaの例の後者の方の例でどうしてもやりたかったから。
608 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 16:28:50 ] そしてスルーされる>599と>600。 >599の設計を見直すとか、>600のソースを纏めるとか、その辺りが正攻法じゃないのか?w
609 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 16:33:39 ] どう転んでも無理なんだから、どこかで妥協するなら、静的メンバで持つのを否定することも選択肢のうちだぜ
610 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 16:34:50 ] 設計を見直す、は設計の正攻法だけど、設計を変えないといけないから、 対処法の正攻法ではない、と。 単に言葉の問題。変なところに噛み付いてこないでね。 >599は説明ミス。指摘のとおりCHogeとCHogeHogeは逆。 >600は うーん、 実際のところはCHogeはテンプレートクラスでm_Valueはテンプレートに渡された型からその型のビットサイズを求めてる。 で、これをほかのクラスで定数のように使いたい、っていう感じなんで、一緒のクラスに実装するのは抵抗ありますね。
611 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 16:38:28 ] 後出しウザい
612 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 16:41:27 ] まさかとは思うが、1クラス1ファイルじゃないといけないなんて思ってないよな? そんな阿呆みたいな糞言語と一緒にされたら困るんだが。
613 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 17:03:07 ] 型情報から定数作りたいだけならmy_traitsクラスでも作ってろよ
614 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 17:11:28 ] 相変わらず終わった話に食いつく奴の多いこと。
615 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 17:17:35 ] 上から目線の質問者が、中途半端な認識で勝手に終了宣言しただけだと なかなかスパッとはいかないね。
616 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 17:49:51 ] >>610 設計が正攻法じゃないのに正攻法な解決っておかしいだろJK
617 名前:デフォルトの名無しさん [2009/03/28(土) 21:51:53 ] class Sample { public: static void func(); }; という定義をヘッダに書いたとき、関数の内容をソースファイルに書く際は、 staticを取って、 void Sample::func() {....} と書けばいいですか? staticはつけてはだめなんですか?
618 名前:デフォルトの名無しさん [2009/03/28(土) 22:02:28 ] >>584 たしかにCygwinで試すと同じエラーになったけど、どうしてだめなのか ぜんぜんわからん、、、 結構C++歴長いんだけどな。誰かわかる人いる?
619 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 22:03:01 ] そうだね。そっちにはstaticは付けない。
620 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 22:03:20 ] >>617 そのとおり。っていうか試せばわかるだろ。
621 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 22:11:39 ] >>618 ポインタや参照型のテンプレート実引数には外部リンケージを持つ オブジェクト(へのポインタ)しか使えない。(メンバへのポインタでは関係ない) 14.4.2 Template non-type arguments p1 より > A template-argument for a non-type, non-template template-parameter shall be one of: > - an integral constant expression; or > - the name of a non-type template-parameter; or > - the address of an object or function with external linkage, including > function templates and function template-ids but excluding non-static > class members, expressed as & id-expression where the & is optional if > the name refers to a function or array, or if the corresponding > template-parameter is a reference; or (以下略)
622 名前:621 mailto:sage [2009/03/28(土) 22:12:41 ] ごめん。 × 外部リンケージを持つオブジェクト ○ 外部リンケージを持つオブジェクトまたは関数
623 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 22:24:28 ] 内部リンケージだと、テンプレートを実体化した先から見えないかもしんないからな。 まあ処理系の実装次第だろうけど、規格としては許すわけにはいかんのだろう。
624 名前:デフォルトの名無しさん [2009/03/28(土) 22:32:26 ] すごい。 そんな仕様があったんだ。でもその仕様から、名前なし名前空間の中の関数とスタティック関数の 動作の違いを作り出すなんて、あんた頭いいね。 ありがとう。
625 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 22:39:16 ] >>624 昔 static 付けて定義した関数を template 引数に使おうとしてエラーになって 半日規格を漁ってたことがあってな。こういうのは知ってるかどうかだけの話で、 頭がいいとか言わんよ。
626 名前:デフォルトの名無しさん [2009/03/28(土) 22:40:26 ] ということは、625はLinux使い?
627 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 22:46:26 ] gcc なら Linux 使いというのは Windows しか知らない奴の思考パターンだな。 PC 以外では gcc や gcc ベースのコンパイラがたくさん使われてるし、 >584 の ように Cygwin だってある。それに規格がああなってる以上、 VC++ が異端なだけ。
628 名前:デフォルトの名無しさん [2009/03/28(土) 22:56:20 ] でもstaticな関数引数をとるテンプレートを使うようなプログラムでgccを使うような人って、 普段はLinux使ってるという気がするけど。 BSD系使いとかSolaris使い? 最近は見かけないし。
629 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:06:44 ] >>628 なんという俺統計。
630 名前:デフォルトの名無しさん [2009/03/28(土) 23:19:23 ] じゃあ結局何使いなの? 俺統計かもしれないが、結構同意してもらえると思うけどな。 Linux使ってんでしょ?
631 名前:625 mailto:sage [2009/03/28(土) 23:39:47 ] なんか変わった人がいるなぁ。 625 の話は「PC 以外」の話で、普段使ってるのは Windows だよ。 >627 も言ってるとおり、 Linux はまったく関係ない。
632 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:08:03 ] 俺も普段は Windows で gcc (Mingw版) 使ってるしなぁ。 Linux と決め付ける根拠も「気がする」とか曖昧な割にしつこい。 まぁ、釣りなんだろうけど。
633 名前:デフォルトの名無しさん [2009/03/29(日) 03:25:48 ] ごめん。 俺プログラマ結構たくさん知ってると思ってたんだけど、その中にWindows+gccという 組み合わせの人がいなかったもんでついつい変な書き方をしちゃった。
634 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 04:07:54 ] OSXが触れられてなくて泣いた
635 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 04:39:41 ] >>633 自分が知ってることが世の中のすべてだと思い込めるその思考回路が信じ難い。
636 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 09:10:55 ] たかがこれっぽっちのやりとりで 相手の思考回路を把握したと思い込める思考回路とかもな。
637 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 09:25:07 ] C++ではファイルスコープの宣言として、無名名前空間を使うことが推奨らしいですけど、 これってグローバル名前空間の中に無名名前空間を作ればいいのですか? 逆に、たとえばMyAppという名前空間に無名名前空間を追加しても、ファイルスコープの宣言とはならないのでしょうか。
638 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 09:51:02 ] >>637 ならない。
639 名前:デフォルトの名無しさん [2009/03/29(日) 10:45:05 ] 1>GameMain.obj : error LNK2005: "class CDXMusic * m_dxmusic" (?m_dxmusic@@3PAVCDXMusic@@A) は既に Frame.obj で定義されています。 1>GameTitle.obj : error LNK2005: "class CDXMusic * m_dxmusic" (?m_dxmusic@@3PAVCDXMusic@@A) は既に Frame.obj で定義されています。 1>CSelect.obj : error LNK2005: "class CDXMusic * m_dxmusic" (?m_dxmusic@@3PAVCDXMusic@@A) は既に Frame.obj で定義されています。 1>C:\.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。 ヘッダーファイルで定義されているクラスにstaticをつけないと上のエラーが出るのですが 何故ですか・・・?
640 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 10:57:16 ] 例のスレの人かな。 >>639 そのヘッダファイルがインクルードされる度にm_dxmusicが定義されているからです。 staticを付けると消えるのは、そのシンボルがエクスポートされずファイルスコープになるからです。インクルードしたファイル毎に別々のm_dxmusicが存在する状態になります。 これが意図した動作ではなく、m_dxmusicが複数のファイルで共有するシンボルなのであれば、ヘッダファイルでextern付きの宣言のみを行い、適当な.cppファイルで1度だけ定義しましょう。
641 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 11:40:43 ] >>637 名前空間の中でもいいよ。あんまり意味無いけど。
642 名前:637 mailto:sage [2009/03/29(日) 12:05:28 ] ありがとうございます。 うちのIDEでは、グローバル名前空間の無名空間がどれも同じ括りで表示されるので、名前空間ごとに把握できたら、 と思ってのことでしたが、グローバル空間に作ることにしました。
643 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 12:12:40 ] いや、名前空間の中でいいってば。
644 名前:デフォルトの名無しさん [2009/03/29(日) 12:19:03 ] >>640 ありがとうございます
645 名前:デフォルトの名無しさん [2009/03/29(日) 15:03:01 ] ruffnex.oc.to/kenji/text/listexport/ ↑のツールと例を使ってkernel32.DLLの書き換えに挑戦してるのですが、 上手く行きません。 DLLを作成しようとすると 「 Error 12: Number Overflow : 」というエラーがdefファイルから検出されます。 エラーが出ている箇所は、「HeapSize=d_HeapSize @680」です。 自分で書き換えた箇所を戻して、コンパイルしてみても駄目でした。 コンパイラはdigital Marsのやつです。OSはvista 原因が特定できなくて困ってます
646 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 16:17:12 ] OSはvista
647 名前:637 mailto:sage [2009/03/29(日) 16:25:23 ] 両方の意見が出たから、安全側とっといた方がいいかなあと思ったんで。 >あんまり意味無いけど。 ということであったし、とりあえずグローバル名前空間の方に書いときます。
648 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 16:39:15 ] >>647 無名名前空間の効果は名前付き名前空間の中でも変わらない。 >638 はデマ。 そして「あんまり意味無い」のは >642 のような事情が無いことが前提。 名前空間の中に入れたほうが便利なのに、わざわざグローバルに持っていく必要は無い。
649 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 16:52:09 ] 「ファイルスコープの宣言」ということなら >638 は正しいだろ。 「ファイルローカルな宣言」ということなら間違いだけど。
650 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 17:00:39 ] そもそも C++ に「ファイルスコープ」などというスコープは無い。
651 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 20:46:44 ] コモンダイアログを用いてファイルの保存等を実装したいのですが、 OPENFILENAMEは定義されていない識別子です、とエラーが表示されてしまいます 何かをincludeすれば良いのでしょうか
652 名前:589 [2009/03/29(日) 20:48:04 ] あのですね、何度も申し訳ありませんが、kbhitじゃダメでした。 while(!kbhit())とかにしても、したまで実行してからじゃ無いと止まってくれません。 do〜whileとか色々試してみたけどやっぱりダメです。 何かいい方法をよろしくお願いします。>>589
653 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 20:52:33 ] >>651 msdn.microsoft.com/en-us/library/ms646839.aspx
654 名前:589 [2009/03/29(日) 21:05:25 ] いいなー、凄いなー
655 名前:589 [2009/03/29(日) 21:06:51 ] >>654 ↑ これ無しwwww NHK見てて間違ったwww 因みに589はマジレスですのでよろしくお願いします。
656 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 21:12:35 ] void foo() { while(1) { Sleep(100); if( _kbhit() ) { printf("Time:%d\n", clock() ); _getch(); } } } int _tmain(void){ HANDLE handle; int id; handle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)foo, NULL, 0, (LPDWORD)&id); while(1) { Sleep(1000); printf("var\n"); } }
657 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 21:17:44 ] // VC++6.0 SP6 #include <conio.h> #include <stdio.h> #include <time.h> #include <windows.h> void main() { time_t tm; int i; while (1) { if (_kbhit()) { i = getch(); if (i == 'e') { break; } time(&tm); printf("%d\n", tm); } Sleep(100); } }
658 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 21:20:53 ] >>651 です Commdlg.hが足りていませんでした 事前調べ不足でした。>>653 さんありがとうございます
659 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 22:58:15 ] >>652 ちゃんとやろうとすると C/C++ の規格内では出来ない。 環境が Windows ならメッセージループを作るべきだろうけど… あるいは既にレスがあるとおりスレッドを作るにしても、 メインスレッドとのやり取りには注意点は多いし。 初心者に説明するには結構こみいった話なんだわ。 ここで全てを説明するのはちょっと無理ってことをわかってくれ。 メッセージループやスレッドの基礎をわかってからまた来い。
660 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 07:24:29 ] 状態移管さえ把握すればCで出来ん訳ない。
661 名前:デフォルトの名無しさん [2009/03/30(月) 08:25:21 ] VC++を使ってますが、NULLを使おうとすると #include <iostream> とかしないとコンパイラが受け付けてくれません。 でも自前のヘッダがあるのでできるならインクルードしたくありません。 このばあいどうすればよいでしょうか インクルードするしかないですか
662 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 08:28:19 ] >>661 C++であるなら NULL は確実に 0 のdefineなので 0 つかっとけ
663 名前:デフォルトの名無しさん [2009/03/30(月) 08:44:19 ] でもポインタの初期化であることをはっきりさせるためにNULLを使いたいんです。 自分で定義するのはだめですか
664 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 08:51:44 ] >>661 VCバージョンいくつよ? VC6なら窓から投げ捨てろ
665 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 08:54:40 ] NULLが欲しいなら #include <cstddef> だろ
666 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 08:55:40 ] >>663 #ifndef 使ってちゃんと囲っておけば コンパイルや動作上の意味では問題は起こらないから 好きにすればいいんじゃないかな 重ねて言うがC++では 0 で定義されてるから >>664 なんにもincludeしてないのにNULLが定義されてるほうがおかしいだろ
667 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 09:15:52 ] >>662 実装依存だよ。 gcc なんかは特別な警告が出るように細工してあったはず。
668 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 09:22:26 ] ほとんどのプログラムはstdio.hかwindows.hをインクルードするから どっかでNULLは定義されるな iostreamは知らん
669 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 09:49:25 ] >>667 調べたらほんとに違うんだな C++ じゃ ((void *)0) はありえないから 0 だぜっての鵜呑みにしてた どうもありがとう
670 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 09:58:13 ] >>668 NULLが定義されてるのは <cstddef> の中(Cなら <stddef.h>)。 それ以外を #include して定義されても処理系依存の動作。
671 名前:デフォルトの名無しさん [2009/03/30(月) 10:27:02 ] boost::shared_ptr<Test> p = new Test(); boost::shared_ptr<Test> p(new Test()); この2つはどう違いますか? 上のやつだとコンパイルできません。
672 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 10:32:30 ] shared_ptrはポインタを取るコンストラクタがexplicitなので、 暗黙の型変換はされない。明示的にコンストラクタを呼ぶ必要がある。
673 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 10:33:19 ] >>670 NULL は cstddef のほかに cstring, ctime, cwchar, clocale, cstdio でも定義されることに なっている。 C.2.2.4 Macro NULL より > The macro NULL, defined in any of <clocale>, <cstddef>, <cstdio>, <cstdlib>, <cstring>, <ctime>, or > <cwchar>, is an implementation-defined C++ null pointer constant in this International Standard.
674 名前:デフォルトの名無しさん [2009/03/30(月) 10:37:20 ] >>672 ありがとうです。 でもよくわかりませんでした。 boost::shared_ptr<Test> p = new Test(); という書き方は明示的にコンストラクタを読んでないということですか?
675 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 10:47:49 ] 明示的に呼ぶとこうなる boost::shared_ptr<Test> x = boost::shared_ptr<Test>(new Test);
676 名前:デフォルトの名無しさん [2009/03/30(月) 10:55:12 ] >>675 それでできました! Testクラス内にboost::shared_ptr<Test> mInstance; というポインタを持たせてたのですが、初期化できずにこまってました。 (初期化をコンストラクタ以外の場所で行いたかったため、 mInstance(new Test()) とかってかけなかった。 ありがとうございました!
677 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 10:56:47 ] >671の前者だと、Test *をboost::shared_ptr<Test>にキャストしようとして失敗するわけだね。
678 名前:デフォルトの名無しさん [2009/03/30(月) 11:16:02 ] >>677 なるほど。 あと、676のような場合は、scoped_ptr<Test>は使えませんよね? コンストラクタで初期化しないから。
679 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 11:21:53 ] >>677 ,678 微妙に誤解してそうな気がするんだけどうまく説明できないので端的に言うと >>675 の形でもshared_ptrのコンストラクタは一回しか呼ばれない
680 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 11:25:43 ] >>676 reset(new Test()) 使えよ。
681 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 11:34:23 ] >>678 コンストラクタで初期化しないことと scoped_ptr での置き換えの可能性は関係ないと思うよ。
682 名前:デフォルトの名無しさん [2009/03/30(月) 11:46:43 ] >>680-681 たしかに、scoped_ptr()でreset(new Test())使うとできました。 ありがとうございました。
683 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 12:00:18 ] すいません。boostをucLinuxに入れようとしてます。 boost_1.38なんですが、boost::conditionが解決できません。 それ以外はコンパイルは通ります。 普通にfedora core7に入れてもだめです。 yum install boost-develだとうまくいくのですが、 なにかやり方があるのでしょうか?初心者ですいません。
684 名前:デフォルトの名無しさん [2009/03/30(月) 12:57:04 ] クラス内にスタティックなポインタを持たせたいのですが、そのポインタをスマートポインタにできるでしょうか? class Test { static boost::scoped_ptr<MyClass> m_MyClass; }; これの実体を書くところで初期化までしようとしているのですがうまくかけません。
685 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 13:04:21 ] >>684 とりあえず書いた奴とエラーメッセージと scoped_ptr のマニュアルをよく見るんだ。 それでもわからなければ、以上の全部を添えて相談するといい。
686 名前:デフォルトの名無しさん [2009/03/30(月) 13:24:56 ] >>685 言われたとおりにもう一回見直してみたらできました。 初期化は boost::scoped_ptr<MyClass> Test::m_MyClass; と書きました。あとBoost::scope_ptrのメンバを持つクラスのデストラクタは privateにしたら駄目なようで、publicにしないとコンパイルできませんでした。 ありがとうございました。
687 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 15:43:17 ] >>683 自己解決しました。 バージョンによって、ソース変えないといけないんですね。 インクルードを適度に増やして解決しました。 さて、リンクまで行ったんですが、クロスコンパイルで、想定通りには ライブラリがうまく出来ていません。 bjamの設定でコンパイラにオプションつけるにはどうしたら いいんでしょうか? クロス開発なんてしてる人はいないですかねw
688 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 20:18:14 ] 要はビルド時のコンパイラをクロスのものにしたいんだろ? bjam -sTOOLS="gcc" -sGXX="/usr/local/cross-tools/sh-hitachi/bin/g++"... でいいんじゃないのか
689 名前:デフォルトの名無しさん [2009/03/30(月) 23:56:13 ] WindowsXP VisualStudio2005のVC++ フォームビューに配置したエディットコントロールで 「Ctrl+A」「Ctrl+X」「Ctrl+C」「Ctrl+V」が全然きかないのですが これはなんなんでしょうか? 他アプリからコピーした文字列をそのエディットコントロールにペースト して処理したいのですが。 ググってもどうにも見つからなくて…。
690 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 23:59:03 ] カスタムからショートカットキーが消えてるとか言うオチはないか?w
691 名前:デフォルトの名無しさん [2009/03/31(火) 00:12:30 ] そのエディットコントロールにフォーカスした状態で メニューバーの「編集」をドロップダウンすると 「切り取り」「コピー」「貼り付け」等,全部グレーで選択不能になってる…。 なんか悪いことしたっけ?
692 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 00:19:59 ] >>689 ウィンドウプロシージャ内でブレーク張って、どこでメッセージが捨てられてるか見てみたら?
693 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 00:22:34 ] >>689 とりあえず、VC++にではなく、メモ帳あたりにコピペできるか試してみたら?
694 名前:デフォルトの名無しさん [2009/03/31(火) 00:34:31 ] あれ? ID_EDIT_COPY等の OnEditCopyとかを自分で記述しなきゃいけないん? エディットコントロールって初めからコピー・カット・ペーストくらい できるんじゃなかったっけ…。
695 名前:589 [2009/03/31(火) 00:42:17 ] >>659 そうなんですか。どうもありがとうございます。 もっと勉強します。
696 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 00:42:46 ] 編集不可になってるとかってオチじゃないのか?
697 名前:デフォルトの名無しさん [2009/03/31(火) 01:04:16 ] >>696 エディットコントロールのプロパティでReadOnlyはFALSEにしてあるんですが…。 今試したら,ダイアログベースのプログラムにエディットコントロールを配置して ビルドすると普通にカット・コピー・ペーストできますね。 でもフォームビューだとできない…。 どちらにしても「Ctrl+A」はきかないし。 こんな超重要ポイントがなんで入門書で触れられていないんだろう。w
698 名前:デフォルトの名無しさん [2009/03/31(火) 01:16:47 ] OnEditCut() { m_edit1.Cut(); } 等を追加してなんとか解決しました。 エディットコントロールが勝手にやってくれると思い込んでいたもので…。 初心者の質問に付き合って下さった方々ありがとうございました。
699 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 01:20:34 ] >>698 それだと、フォームビュー上の別コントロールにフォーカスあるときも反応しちゃわないかな? まぁEdit一つだけのデザインなら問題ないけど・・・複数あるなら困りそう。
700 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 01:33:40 ] IsDialogMessage
701 名前:デフォルトの名無しさん [2009/03/31(火) 01:34:42 ] >>699 複数あるんです。w 今作っているものはエディットコントロールが2個あって片方はReadOnlyなのですが。 あと「Ctrl+A」もぜひ装備したいし…。
702 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 02:03:50 ] >>701 フォームビューだと勝手にやってくれなかったんだっけなぁ・・・? と気になって試しにプロジェクト作ってみたら、やっぱできないわwww というかむしろ、CDialogやCEditViewなら親切にやってくれてる、という話なんだろう。 ttp://www.vcppclub.com/bbs11/wforum.cgi?no=4256&reno=no&oya=4256&mode=msgview ttp://support.microsoft.com/kb/145616/ja
703 名前:デフォルトの名無しさん [2009/03/31(火) 02:24:15 ] >>702 参照先ありがとうございます。 今「どのコントロールにフォーカスがあってもm_edit1のエディットコントロールに ペーストされる」みたいな珍妙な動作になっています。w GetFocus()を試してみます。
704 名前:デフォルトの名無しさん [2009/03/31(火) 04:54:38 ] シングルトンで多態のクラスを作ったのですが、Baseクラスのコンストラクタとデストラクタを プライベートに置こうとすると、コンパイルエラーになります。そこで、コンストラクタはProtected に置いて、デストラクタはPublicに置きました。これって、こうするしかないですか? ちなみに、多態を使うためのポインタを、Boost::scoped_ptr<>に置いてます。
705 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 06:30:49 ] 生成と廃棄のコードをBaseの関数テンプレートにする。
706 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 06:32:13 ] あ、廃棄はいいのか。寝起きだとボケてていかん。
707 名前:デフォルトの名無しさん [2009/03/31(火) 09:47:34 ] 最近スマポについて色々質問させてもらっているものです。 もうちょっとだけ質問させてください。 スマポに保存しているポインタを取り出して関数とかに渡すとき、関数はスマポの形の 引数でポインタを受けるべきですか?それとも生のポインタで受けるべきですか? class Hoge { public: boost::scoped_ptr<MyClass> m_MyClass; }; というクラスがあるとして、このm_MyClassが持っているポインタを別の関数に渡すとき、 void func(MyClass *pMyClass); void func(boost::scoped_ptr<MyClass> pMyClass); このどっちの形にするべきなのか、わかりません。 どうかお願いします。
708 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 09:50:50 ] scoped_ptrはコピーできないだろ
709 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 10:24:57 ] >>688 mipsなんで、オプションを指定しないと正しいエンディアンにコンパイルできない。 bjamもバージョンで指定の仕方が違うなぁ。 試行錯誤しますです。
710 名前:デフォルトの名無しさん [2009/03/31(火) 11:03:04 ] >>706 ありがとうございます。 Baseをテンプレートクラスにして、関数テンプレートを受けとり コンストラクタの代わりにつかう、ということですか? すげえややこしそうな気が、、、
711 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 12:26:30 ] >>688 gcc,g++等をシェルスクリプトで作ったらコンパイルできました! 引数もシェルスクリプトに入れたらスッキリインストール完了しました。 ところが、ucLibにはn_procs()というglibの関数がないんですね。 mips用のboostできたのに、ここからコンパイルできないや… どこまでひっかかるんだか…
712 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 12:38:57 ] 大抵はシングルトンをペチペチ叩く棒が多態になってれば十分だよね?
713 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 13:08:32 ] >>707 どっちでもない。参照を使え。
714 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 13:09:36 ] >>704 よく意味がわかんないから、ソース晒してくれたほうがいいと思うよ。
715 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 14:34:12 ] std::string buf; std::ifstream ifs; ifs.exceptions(std::ios_base::failbit); //前半 ifs.open("a.txt"); std::getline(ifs, buf, '\0'); ifs.close(); buf.clear(); //後半 ifs.open("b.txt"); std::getline(ifs, buf, '\0'); ifs.close(); これを実行すると例外std::ios_base::failureが投げられるんですけど、どうすればファイルを2つ読み込めますか? ちなみに、前半か後半のどちらかをコメントアウトすれば例外は発生しません。
716 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 14:41:47 ] >>715 前半と後半の間に ifs.clear() を入れればいいんだろうけど、そもそも 同じストリームオブジェクトで別々のファイルを開くというのが混乱の元の ような気がする。 できれば別々のストリームオブジェクトを使うとか、前半と後半とを関数に 分けるとかするのがおすすめ。
717 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 14:47:06 ] >>716 ありがとうございます。
718 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 15:25:57 ] >>688 結局自力で解決できました。 boost::threadに相当するソースのget_nprocs(CPUの数) を1にして、再度staticリンク指定したことで、 mips/ucLinuxのboostを作成でき、動作しました。
719 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 17:35:41 ] 質問なんですが、Effective C++を読んで func(boost::scoped_ptr<X>(new X), boost::scoped_ptr<X>(new X)); としたらメモリリークの危険があるのは引数の実行順が不定だからであり、それは分かります (前者のnew Xが実行の後、後者のnew Xが実行中そのコンストラクタで例外が出たときとか) その本では、スマートポインタへnewしたポインタを渡すのは独立したステートメントでやろう、となっているのですが func(boost::scoped_ptr<X>(new X)); とした場合も危険はあるのでしょうか new X → shared_ptr → 引数呼び出しの順番は変わらないような気がするので
720 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 18:39:42 ] それなら問題ないよ。
721 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 04:19:11 ] >>719 危険性があるかどうかって話なら >720 のとおり無いんだけど、 あとで func() に引数を足した場合に問題が発生する形に変更されてしまう 可能性が高いんだからそんなコードを書いていいってことには ならないよ。
722 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 10:28:14 ] // value.cpp namespace { int value = 5; } int getValue() { return ++value; } // use.cpp int useValue() { return 2 * getValue(); } // test.cpp namespace { int n = useValue(); } というようなコードを書いた場合、test.cppでuseValueが呼び出されると、 getValueのコードも既に実在しているハズだからvalueも初期化済みということになりますか?
723 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 10:32:33 ] 初期化順をコントロールするならシングルトンにしとけと、ばっちゃが(ry
724 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 11:15:30 ] >>722 value は静的な初期化で済むから、動的な初期化を必要とする n の初期化より先に 初期化されることは決まっている。 だからといって、そんな重箱の隅みたいな規則に依存するコードはおすすめできない。
725 名前:デフォルトの名無しさん [2009/04/01(水) 12:36:59 ] ということは、関数の定義位置などとは関係なしに、変数の初期化順が決まるということですね。 そこら辺については未熟なので、勉強して理解できるようになるまでは、 何とか自分で扱えるような方法で考えてみます。ありがとうございました。
726 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 14:36:43 ] >>166 を誰か考察して。
727 名前:デフォルトの名無しさん [2009/04/01(水) 15:30:21 ] class File { public: const char* data() const; private: boost::shared_array<char> m_Data; }; こういうクラスがあって、m_Dataがcharの配列で、そこにデータが入ってます。 データは画像(バイナリ)です。そのデータにアクセスする手段として、 const char* data() const; というのを作ったんですが、これは参照にすべきなのでしょうか?それとも boost::shared_ptr<const char> data() const; とかのように、ここでもスマポを使うべきでしょうか? よろしくお願いします。
728 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 18:47:12 ] >>727 そもそも m_Data 全域へのアクセスを公開する必要があるのかどうか、だな。 getData(int index) でだめな理由はなんだろうか? execute() で、内部にアルゴリズムを実装してはどうだろうか? とか、考える方が先かも。
729 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 18:49:35 ] >728には>727の書いていることが理解できないらしい。 ・アクセス関数の戻り値の型をどうしたらいいか というのが質問の趣旨ですぜ。
730 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 19:34:11 ] ほうほうそれでそれで
731 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 19:37:54 ] スマポへの参照がいいんじゃないかな。 生ポならそのままコピーしちゃうけど スマポはクラスでおっきいから。 boost使ったことないからよくわからんけど
732 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 19:41:47 ] >>727 template<typename T> const T data(const T&)const {return static_cast<const T>(m_data);} 変な受け皿用意されたらコンパイル時に蹴る。
733 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:36:19 ] C言語の質問です。 以下のコードがbus errorで死ぬんですが、何が間違っているのですか? #include <stdio.h> #include <stdlib.h> void f(char **p); int main(void) { char *p; f(&p); free(*p); return 0; } void f(char **p) { *p = (char *)malloc(2); *p[1] = 0; }
734 名前:733 mailto:sage [2009/04/01(水) 22:38:27 ] あ、すみません。free(*p)はfree(p)の間違いです。 それと、どうやら*p[1] = 0;のところで死ぬようです。
735 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:42:41 ] > それと、どうやら*p[1] = 0;のところで死ぬようです。 (*p)[1] = 0;
736 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:42:54 ] mmalock( sizeof(char *) * 2 );
737 名前:736 mailto:sage [2009/04/01(水) 22:45:23 ] あれ、俺の頭がおかしい
738 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:56:48 ] ああ、疲れてんだな
739 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 23:18:38 ] >>735 演算子の優先順位の問題でしたか。ありがとうございます。
740 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 02:44:47 ] >>166 ,726 未初期化のオブジェクト i に対してドット演算子を適用することにより、未定義動作。
741 名前:デフォルトの名無しさん [2009/04/02(木) 05:14:00 ] int *p = new int; int *p = new int(1); int *p = new int(100); これってどう違うんですか? 全部コンパイル出来てしまいます。
742 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 05:22:10 ] >>741 int *p = new int; ← 不定値 int *p = new int(1); ← 1で初期化 int *p = new int(100); ← 100で初期化
743 名前:デフォルトの名無しさん [2009/04/02(木) 08:48:19 ] >>742 ありがとうございました。
744 名前:デフォルトの名無しさん [2009/04/02(木) 14:51:45 ] メモリリークを検出しようと思い #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> とやったのですが__CrtSetDbgFlagを呼ぶと 1>Frame.obj : error LNK2019: 未解決の外部シンボル __CrtSetDbgFlag が関数 _wWinMain@16 で参照されました。 と出ます アドバイスください;;
745 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 14:56:26 ] >>744 リリースビルドでやってないよね?
746 名前:744 [2009/04/02(木) 14:57:41 ] デバッグでやってます
747 名前:744 [2009/04/02(木) 14:59:04 ] c/c++ コード生成 ランタイムライブラリ がマルチスレッド(/MT)ですけど関係ありますかね
748 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 15:06:57 ] /MTdじゃないのか?
749 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 15:07:44 ] /MT は、リリースビルド用・・・
750 名前:744 [2009/04/02(木) 15:10:18 ] すみません・・・・ 勉強になりました ありがとうございます
751 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 23:31:23 ] >発注額929億円のうち地元業者が受注したのは13%の122億円だった。 スポンサー以外を悪に仕立てたいマスコミと真に受ける馬鹿な国民が居る限りどうしようもないだろ。
752 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 23:33:24 ] 談合必要論か
753 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 23:36:38 ] 誤爆乙
754 名前:デフォルトの名無しさん [2009/04/02(木) 23:56:14 ] shared_ptrのスマポをNULLで初期化できますか?
755 名前:デフォルトの名無しさん [2009/04/02(木) 23:57:21 ] boost::shared_ptr<MyClass> m_MyClass = boost::shared_ptr<MyClass>(reinterpret_cast<MyClass*>(0)); とやってできました。
756 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 00:03:38 ] >>754-755 単にboost::shared_ptr<MyClass> m_MyClass;ではだめなの?
757 名前:デフォルトの名無しさん [2009/04/03(金) 00:19:11 ] >>756 そうやって作成したスマポが、中身が入ってるかゼロなのか、NULLと比較しても いいのですか?
758 名前:デフォルトの名無しさん [2009/04/03(金) 01:23:15 ] すいません、初心者じゃない(つもり)なんですが、初心の質問させてください。 char data[100]; というデータがあるとき、 unsigned int func1(int i) { unsigned char* p = reinterpret_cast<unsigned char*>(data); unsigned int r = p[i]; r |= p[i + 1] << 8; r |= p[i + 2] << 16; r |= p[i + 3] << 24; return r; } unsigned int func2(int i) { unsigned int ret = data[i]; ret += data[i+1] << 8; ret += data[i+2] << 16; ret += data[i+3] << 24; return ret; } この2つの関数の出力が違う場合があるのですが、(たとえばこうやって初期化した場合) for (int i = 0; i < 100; ++i) { data[i] = 129; } どうしてでしょうか?
759 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 01:30:10 ] >>757 デフォルトコンストラクタはこうなってる shared_ptr(): px(0), pn() // never throws in 1.30+ { } px は内部に持つ生のポインタ
760 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 01:35:56 ] >>758 129 が CHAR_MAX より大きい可能性が高いな。
761 名前:デフォルトの名無しさん [2009/04/03(金) 05:59:03 ] ありがとうです。CHAR_MAXは127でした。 色々と理由を考えてたのですが、 (1) unsigned char a = 0xff; (2) char a = 0xff; cout << static_cast<int>(a<<8) << endl; (1)のように書くと0xff00と出力され、 (2)のように書くと0xffffff00と出力されます。 unsigned charとcharではシフトの方法が違うんでしょうか?
762 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 06:23:45 ] >>761 その場合は符号拡張の話だな int にキャストした段階で違いが起こってる
763 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 07:45:19 ] (1) unsigned char a = 0xff; a = 0xff (255) を int 型にすると 0x000000ff (255) ※符号拡張の際、unsigned int 型を経由 (2) char a = 0xff; a = 0xff (-1) を int 型にすると 0xffffffff (-1) まあ大抵の場合、char 型で文字を扱うとき unsigned char にしといた方が いちいちキャストしたりとか面倒なことをせずに済む
764 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 08:12:15 ] >>761 そもそも CHAR_MAX が 127 なら char a = 0xff でも char a = 129 でも値は実装依存になる。 コンパイラやそのバージョンやコンパイルオプションの違いで変わってくるかもしれない。 一般的には、符号付 char の表現は 2 の補数で、収まらないビットは切り捨てられるだけ だから、以下 >763
765 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 09:13:17 ] char を unsigned int に型変換するときは int に符号拡張してから unsigned int に変換される char a に -1 (0xff) が入ってる場合は一旦 int 型 -1 (0xffffffff) に符号拡張され unsigned int 4,294,967,295 (0xffffffff) に変換される
766 名前:デフォルトの名無しさん [2009/04/03(金) 10:56:18 ] while(!(ret_cd = fetch_data())){ : (フェッチしたレコードに関する処理部) : } -------------------------- 関数 int fetch_data(void) { : (レコードデータ取得部) : return(0) } ------------------------- 上記のようなプログラムで while文の条件文の意味がよくわかりません。 全体の流れが「レコードが存在する間、処理を繰り返す」ような 処理ということはわかるのですが、 !(ret_cd=fetch_data())ときいている意味が はっきりわからないのでどなたかお願いします。
767 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 11:03:57 ] >>766 > !(ret_cd=fetch_data())ときいている意味 「レコードが存在」しているかどうか,という意味なんじゃない?
768 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 11:44:08 ] fetch_data() は、レコードが存在すると 0、レコードが存在しないと 0 以外(たとえば -1) を返すのだろう レコードが存在する !(0) → 真となり、処理継続 レコードが存在しない !(-1) → 偽となり、処理終了 ぱっと見に分かりづらいから while(!(ret_cd = fetch_data())){ ↓ while((ret_cd = fetch_data()) == 0){ と書き換えてもいいかもしらん
769 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:02:29 ] 技術的な面以外で.. 「〜をする意味」は有効な回答が付きづらい 概して「考えれば分かる」とか言われるのが落ち 質問の仕方が分からなくて,適当に取って着けたように「〜とはどういう意味でしょうか?」と聞いてしまうよりは, 必要な用語とか,質問に至るまでの状況とかをしっかり書いておくほうが無難
770 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:06:14 ] 単に、代入と検査を一緒にやってるだけだろ
771 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:29:49 ] まあ>>768 の通りだが、 おそらく、 ! が見た目通りに否定の意味に感じるので 直感的に理解しづらいということだろう。 !strcmp() などもそうだが、 ==0 の意図で ! を使う人は結構居る。俺は極力 ==0 を使うが。 慣れればどうということは無いのだろうが、読むときに一瞬考えるので。
772 名前:デフォルトの名無しさん [2009/04/03(金) 14:14:14 ] 766です。 質問の仕方も曖昧ですみません。 レスいただきありがとうございます。 しかしまだ消化不足…といいますか、流れについて いけてないです。現在修正中のプログラムが下記のような流れです。 @カーソルセット EXEC SQL DECLARE cur_TEST CURSOR FOR SELECT・・・ FROM・・・ WHERE・・・ EXEC SQL OPEN cur_TEST;
773 名前:デフォルトの名無しさん [2009/04/03(金) 14:15:05 ] Aフェッチしながら項目セット while(!(ret_cd=fetch_data())){ /* 中間ファイル構造体の各項目に値セット */ sprintf(・・・) sprintf(・・・) /* 中間ファイルに出力 */ if(temp_write(Ofp, &out)){ fclose ( Ofp ); strcat( Errmsg, "temp_write:write_error" ); AB_sjmsg( Errmsg ); putenv( Errmsg ); return(-1); } } 中間ファイルクローズ fclose(Ofp) return(ret_cd);
774 名前:デフォルトの名無しさん [2009/04/03(金) 14:15:48 ] (出力関数) int temp_write( FILE *Ofp, struct TEST *dat ) { int ret; ret = fprintf(Ofp, "%-1.1s" , dat->AAA ) > -1; ret = ret && fprintf(Ofp, "%-5.5s" , dat->BBB ) > -1; ret = ret && fprintf(Ofp, "%-8.8s" , dat->CCC ) > -1; return(ret ? 0 : -1); }
775 名前:デフォルトの名無しさん [2009/04/03(金) 14:16:34 ] 実は今回このwhile(!(ret_cd=fetch_data()))の中で もうひとつテーブルを読み、そこで抽出したレコード(複数件)が なくなるまで繰り返す・・・という入れ子の処理を追加しないといけなくなりました。 単純にやり方を真似てfetch_data2という関数をつくり、 while(!(ret_cd=fetch_data()))の中で while(!(ret_cd=fetch_data2()))と記述して、やろうとしてるのですが エラーが出るため、今まで曖昧だったwhile(!(ret_cd=fetch_data()))部の 意味をはっきりさせようと思った次第です。
776 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 14:16:45 ] で?
777 名前:デフォルトの名無しさん [2009/04/03(金) 15:04:11 ] >>776 死ね
778 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 15:30:31 ] で、どこまで理解できて、どこが理解できなくて、 どんなエラーが出るの?
779 名前:デフォルトの名無しさん [2009/04/03(金) 15:40:55 ] 途中で止まっており失礼しました。 わからない点は、!(ret_cd=fetch_data())の部分で、 ret_cdになんの値がセットされているかです。 int型で定義されてはいますが、これに値がセットされるところを 探しても見つけきれないので。 fetch_data関数は、「if(sqlca.splcode==1403)(抽出データが終了したら) return(1)」という処理が入っているので、セットされる値の変わり目が はっきりとわかります。 なんだかどうしようもない質問をしてしまったみたいで申し訳ないです。 もう少し詮索してみます。
780 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 15:42:44 ] >>779 何の値、って、fetch_data() 関数の戻り値でしょ。 デバッガで一行ずつ追ってみれば? もしくは、printf とかで。
781 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 15:59:14 ] >>779 ret_cd=fetch_data() のところでret_cdには0か1がセットされる
782 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 17:23:37 ] もうクビになっちゃえば
783 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 18:00:59 ] >>766 から>>779 までの5時間を 本なりサイトなりを使った「基礎からのCの勉強」に充てていれば、 今頃は普通に理解できるようになってたと思うw
784 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 19:46:00 ] C++言語でファイルのサイズや更新日時を取得する機能を持つクラスを、 #include <stdio.h> FILE *fopen(const char *, const char *); int fileno(FILE *); int fclose(FILE *); #include <sys\stat.h> int fstat(int handle, struct stat *statbuf); の関数や構造体を使って作ったものの、あまり良くないようだ。 大量のファイルを調べると、遅くてハードディスクへのアクセスが、かなりのものだ。 VBでFileLen()やFileDateTime()関数使ったプログラムのほうが速いし、ハードディスクに ほとんどアクセスしなくて済んでる。 ファイルを開かなくて取得できんのかな。いい方法ないもんか。
785 名前:デフォルトの名無しさん [2009/04/03(金) 19:51:09 ] まあそういうなよ。 おれたちも、766みたいな頃を経てきたわけだろ。 なんとなく、766はできないプログラマになりそうな気もするけど
786 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 19:54:54 ] fstat の実装がどうなってるか知らないけど、GetFileSize() やら GetFileTime() やらを 使った方が速いのかもね。
787 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 19:57:55 ] じゃあ _stat(const char *, struct _stat *) とか FindFirstFile/FindNextFileでもつかっとけよ。 Windowsならディレクトリエントリだけの話になるから。
788 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:00:43 ] そいや、ファイルハンドルが必要なやつは遅い、って話を聞いたことがあるな。 実際の値が必要なときは、これを使わざるを得ないんだけど。
789 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:21:42 ] windowの関数を勉強しないとならんな 低レベルなプログラム書けるように勉強しないとならんな
790 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:32:15 ] 代入と評価を同時にしたら、読みにくくなるだろう。 横着やな。
791 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:51:09 ] いやWinしらてとのAPIとか20年前に頭に入っていて当然なんだが
792 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:55:16 ] 日本語
793 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:56:58 ] どこの方言か知らんけど意味わからん
794 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:00:19 ] しらてと?
795 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:03:05 ] すなみ はにりいと とんとかいも
796 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:07:14 ] 女の我侭は異常 おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』 彼女 『うん!』 おいら『ほら!(得意げに)』 彼女 『何これ?PC98じゃない!幻滅!』 おいら『え、だってみんなPC98が普通だし....』 彼女 『普通X68000でしょ?何このねずみ色の本体・・・最低。 大体、ゲームだってショボイRPGやシミュレーションばかりでしょ? シューティングは?まともなシューティングはあるの?ないでしょ?』 おいら『...』 彼女 『大体、256色ってなに?しかもデフォルト16色のゲームまであるしw こんなので満足できるの?しょぼいエロゲならこの色数でいいのかも知れないけどさw スーファミじゃないんだからさ。分かるでしょ?』 おいら『...』 彼女 『うわー音が汚いwなにこれ?FM音源?だけなの? PCMは?MIDIは?使ってないの?』 おいら『....』 彼女 『動きが汚ーい!遅ーい!最低ー! スプライトもないのに多重スクロールなんて見栄張って馬鹿じゃないの? なにこのカクカクスクロールは?ファミコン以下じゃん!』 おいら 『....』 彼女 『しょうがないからうちでX68000で遊ぶ? 出たなTwinBee!やファイナルファイトの2Pプレイとか楽しいよ?』 おいら『うん...』 以上実話です。
797 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:13:35 ] 1989年のWinしらてとて、386 2.1か。 WinしらてとてのAPIどころか、Winしらてとて自体知る人は限られてただろう。
798 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:15:58 ] 間違えた。 WinしらてとのAPIどころか、Winしらてと自体(以下略)
799 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 21:23:15 ] うちにある最古のAPI本ですらMSC7/VC1.0のリファレンス(93年)だぞ 20年前ってどうよ
800 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 22:17:03 ] >>796 悔しいがワラタ
801 名前:デフォルトの名無しさん [2009/04/03(金) 22:35:23 ] 女の我侭は異常 おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』 彼女 『うん!』 おいら『ちょっと待って!俺がゲームのためにこれ買ったと思ってんの?』 彼女 『うん!』 おいら『違うよ、世の中のコンピュータを上手く繋げるソフトを開発するためなんだ よ(得意げに)』 彼女 『何それ?ニフティとかのこと?幻滅!』 おいら『いや、そんなんじゃないよ。これからは世界中のコンピュータが繋がる ようになるんだよ。いま目の前にあるコンピュータと、たとえばアメリカのどこかに あるコンピュータとが繋がって、互いに自由にやり取りができるようになるんだよ。』 彼女 『でも、そんなの電話料金が大変でしょ?何このねずみ色の本体・・・最低。 大体、ゲームだってショボイRPGやシミュレーションばかりでしょ? シューティングは?まともなシューティングはあるの?ないでしょ?』 おいら『だからゲームなんか興味ないんだって。とりあえずフィンランドの人が作った 基本ソフトを移植してみようと思ってるんだ。そのあと、相手のコンピュータの中の 情報をもっと見やすいように表示できるソフトを開発して(注:頭の中には初期のネスケ のようなソフトのイメージ)、、、あと沢山のコンピュータが繋がるようになってくる と、外部からコンピュータを勝手に操作されないようにするソフトも需要があると思う し、、』
802 名前:デフォルトの名無しさん [2009/04/03(金) 22:38:38 ] 彼女 『大体、256色ってなに?しかもデフォルト16色のゲームまであるしw こんなので満足できるの?しょぼいエロゲならこの色数でいいのかも知れないけどさw スーファミじゃないんだからさ。分かるでしょ?だいたいアメリカと日本って時差が あるのよ、どうやって寝てる人とやり取りすんのよ?それに外部から操作なんて、画面 もみないでどうやって操作すんのよ?あんたおかしいんじゃない?』 おいら『...』 彼女 『うわー音が汚いwなにこれ?FM音源?だけなの? PCMは?MIDIは?使ってないの?』 おいら『...そうだ、C++のコンパイラからまず作らないとだめだな。。。.』 彼女 『動きが汚ーい!遅ーい!最低ー! スプライトもないのに多重スクロールなんて見栄張って馬鹿じゃないの? なにこのカクカクスクロールは?ファミコン以下じゃん!』 おいら 『...俺の話も聞いてくれよ。ほんとにいいアイデアなんだって!当たったらデカイよ?』 彼女 『しょうがないからうちでX68000で遊ぶ? 出たなTwinBee!やファイナルファイトの2Pプレイとか楽しいよ?』 おいら『うん...(今まで誰もおいらの話をまともに聞いてくれないんだよな。どっか間違ってんのかな。。)』
803 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 22:39:50 ] 女の我侭は異常 おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』 おんな『シネよキモデブ。二度と話しかけんな』
804 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 23:40:26 ] >803 ついでに此処へも書き込みしないでいいよ。
805 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 23:42:50 ] コピペとしてはまだまだいけてないな もっとブラッシュアップしてくれ
806 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 23:48:07 ] ヘルプです。環境は「mingw32,gtk,fc10+rawhide,wine」 やりたいことは「stdin(fd=0)からCALLBACK関数」で、 順次データを読み出すだけなんですが、私の環境ではうまく動かないです。 止まったり、データがなくなったり。Fedoraの板でサワイでたんですが、 もう諦めモードにはいってきたTT;mingw32環境ある方、試してもらえないでしょうか? よろしくお願いします。以下、サンプルソース #include <unistd.h> #include <stdio.h> #include <gtk/gtk.h> int main(int argc,char **argv); gboolean inputcb(GIOChannel *source,GIOCondition condition,gpointer data); GIOChannel *gio; int main(int argc,char **argv){ gtk_set_locale(); gtk_init(&argc,&argv); gio = g_io_channel_unix_new(0); fprintf(stderr,"gio(%d,%d)\n",(int)gio,G_IO_IN); g_io_add_watch(gio,G_IO_IN,(GIOFunc)inputcb,NULL); gtk_main(); return 0; } gboolean inputcb(GIOChannel *source,GIOCondition condition,gpointer data){ char temp; fprintf(stderr,"gio(%d,%d,%d)\n",(int)source,condition,(int)data);fflush(stderr); read(0,&temp,1); fprintf(stderr,"temp(%d)\n",temp);fflush(stderr); return TRUE; }
807 名前:デフォルトの名無しさん [2009/04/04(土) 11:28:40 ] スマポで質問があります。 class MainClass; class SubClass { public: void func2(MainClass* mc) {} }; class MainClass { public: MainClass() : m_SubClass(new SubClass()) {} ~MainClass() {} void func1() { m_SubClass->func2(this); // このthisをスマポ(shared_ptr)にする方法はありますか? } private: boost::shared_ptr<SubClass> m_SubClass; }; int main() { MainClass m; m.func1(); return 0; } どうかよろしくお願いします。
808 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:31:52 ] お前どう見てもスマポの使い方判ってないからやめとけ
809 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:39:33 ] scoped_ptrでいいじゃん
810 名前:デフォルトの名無しさん [2009/04/04(土) 11:39:47 ] >>808 どうしてですか? private:でshared_ptrにしたからですか? なんとか使えるようになりたいんです。 どうかお願いします。
811 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:39:49 ] >>808 なんつー的確な指摘w
812 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:40:58 ] どっちかとういうとthisがまったくわかってないじゃないか?
813 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:46:52 ] なんつーか、『オムレツ作りたいんです! 教えてください!』と言って来た奴が 材料として卵とチェーンソーと蚊取り線香を持ってきたような感じ。 ただ判ってないだけじゃなくて、判ってないままあらぬ方向に突き進んでいる。
814 名前:デフォルトの名無しさん [2009/04/04(土) 11:49:53 ] 色々返事くれてありがとう。 void func2(MainClass* mc) {} ここなんですが、最初は void func2(boost::shared_ptr<MainClass>& mc) {} こう書いてました。でもこれだと呼び出し元でthisを引数にしたとき コンパイルが通りませんでした。スマポの使い方として、生のポインタは 基本的に全部スマポで置き換えるのが正しいと思うのですが、そうすると thisはどうやって渡せばいいかわからなかったので。。。
815 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:50:37 ] オムレツ作りたいんです! はいいけど、君それ、手に持ってるのゆで卵だよね? みたいな。
816 名前:デフォルトの名無しさん [2009/04/04(土) 11:51:37 ] >>813 なにか肝心なもの(フライパン)が抜けてるということですか?
817 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:59:38 ] とりあえずconst
818 名前:デフォルトの名無しさん [2009/04/04(土) 12:08:37 ] m_SubClass->func2(boost::shared_ptr<MainClass>(this)); こう書くとAssertionに引っかかるし、、、 これって循環参照になってるから?
819 名前:デフォルトの名無しさん [2009/04/04(土) 12:26:50 ] プログラム中に可変で動的にメモリ確保をしたいのですが Animationset m_animset; という構造体があり、m_anim->GetAnimset(); というメソッドで個数が取得できます m_animsetを最初から配列で100個くらい作っておけば問題ないのですが 可変で作る場合はどうすればいいのですか?
820 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 12:28:59 ] >>819 vectorつかう
821 名前:デフォルトの名無しさん [2009/04/04(土) 12:29:56 ] >>820 ありがとうございますvectorについて調べてみます
822 名前:デフォルトの名無しさん [2009/04/04(土) 12:36:32 ] ダブルポインタでいいだろ Animationset **m_animset;
823 名前:デフォルトの名無しさん [2009/04/04(土) 12:57:52 ] vector<AnimationSet> m_animset; for(DWORD i = 0; i < m_animectrl->GetNumAnimationSets(); i++) { m_animset.push_back(i); m_animectrl->GetAnimationSet(i, &m_animset[i].pAnimSet); } という風にしたのですが 'std::vector<_Ty>::push_back' : 1 番目の引数を 'DWORD' から 'const AnimationSet &' に変換できません とエラーが出ます メモリを確保するにはどうすればいいのでしょうか・・・・
824 名前:823 [2009/04/04(土) 13:05:05 ] for(DWORD i = 0; i < m_animectrl->GetNumAnimationSets(); i++) { AnimationSet anim; m_animset.push_back(anim); m_animectrl->GetAnimationSet(i, &m_animset[i].pAnimSet); } という風にしたらできました
825 名前:デフォルトの名無しさん [2009/04/04(土) 13:39:00 ] 何が出来たの?
826 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 13:50:42 ] >>807 enable_shared_from_this使えばいいんでないの?
827 名前:デフォルトの名無しさん [2009/04/04(土) 13:55:39 ] >>825 欲しい分だけメモリ確保です
828 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 14:20:58 ] コピコンあるのね把握した
829 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 17:57:33 ] >>822 ダブルポインタって、ただのポインタのポインタとなにが違うんですか?
830 名前:>>829 [2009/04/04(土) 18:37:39 ] Ragnarok **m_ragna;
831 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 18:39:38 ] >>829 その言葉を使う人間ができるプログラマかどうか。
832 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 20:14:39 ] ダブルポインタ、なんて変な言葉使う人間こそプログラマじゃないだろうな
833 名前:デフォルトの名無しさん [2009/04/04(土) 20:35:11 ] >>826 enable_shared_from_thisを使ってみましたが、コンパイルは通るけど実行すると Boostが例外を投げます。 class MainClass; class SubClass { public: template <class T> void func2(boost::shared_ptr<T>& mc) {} }; class MainClass : public boost::enable_shared_from_this<MainClass> { public: MainClass() : m_SubClass(new SubClass()) {} ~MainClass() {} void func1() { m_SubClass->func2(shared_from_this()); } private: boost::scoped_ptr<SubClass> m_SubClass; }; int main() { MainClass m; m.func1(); return 0; }
834 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 20:42:29 ] >>833 ああごめん。大元のm自体をshared_ptrに格納するようにしないとshared_from_this()も使えないよ。
835 名前:デフォルトの名無しさん [2009/04/04(土) 20:54:19 ] >>834 ありがとうございます。 >大元のm自体をshared_ptrに格納する というのは、 boost::scoped_ptr<SubClass> m_SubClass; を boost::scoped_ptr<SubClass> m_SubClass; とするということですよね? そうしてもBoostから例外を投げられます。聞いてばかりですいません。。
836 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 20:59:29 ] >>835 違う違う、こっち。 int main() { boost::shared_ptr<MainClass> pm(new MainClass); pm->func1(); return 0; }
837 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 21:09:54 ] >>832 俺、ポッぽインタって言っている で、3つはぽっぽっぽインタだな
838 名前:デフォルトの名無しさん [2009/04/04(土) 21:10:23 ] >>836 なるほど、動きました! thisがboost::shared_ptr<MainClass>でなければならなかったということですね。 本当にありがとうございました。
839 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 21:17:04 ] C++再考 という本のサンプルコードの一部です、コンパイルすると、下記のエラーが出ます 何処がおかしいのでしょうか? VS2005 pro SP1 winXP SP3 #include <iostream> using namespace std; class Expr_node { friend ostream& operator<<(ostream&, const Expr&); friend class Expr; int use; protected: Expr_node():use(1){} virtual void print(ostream&) const = 0; virtual ~Expr_node(){} }; error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません error C2143: 構文エラー : ',' が '&' の前にありません。
840 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 21:22:15 ] >>839 friend ostream& operator<<(ostream&, const Expr_node&); Exprなんて型ないからExprを変数名だと推定してる
841 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 21:28:37 ] >>839 なぜエラー行を抜いた class Expr;を前方宣言か?
842 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:05:38 ] >>814 > スマポの使い方として、生のポインタは > 基本的に全部スマポで置き換えるのが正しい どこからそんなアホな理屈が出てきたんだ?
843 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:10:59 ] 全部が全部正しいとは思わないが C++ Coding Standardsでは「できれば」スマポを使うべきだとしているし Googleコーディング標準でもスマポがいいねって書いてあるから まぁ初心者はそのくらいの気持ちでもいいかも。 ただ、だからといってboostを使うのではなく 一度は自前で参照カウンタつきのスマポを設計してみる必要があるんじゃないだろうか。 ちんぽちんぽ。
844 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:16:10 ] Accelerated C++でもネタになってるな>スマポの自作
845 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:17:31 ] >>843 貴方の自前の参照カウンタつきのスマポ見せて、まんこ、まんこ
846 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:30:40 ] >>843 >807 の例は参照に置き換えれば済むだろう。 所有権の移動や共有のためのポインタ引数なんてそんなに多いとは思わない。
847 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:33:15 ] >>846 ああなるほど。 確かに、参照が使えるところには ポインタよりも参照を使うべきだというのには同意。
848 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:33:25 ] もうね、スマポ
849 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 23:01:56 ] >>840 >>841 スマンカッタ 大きな勘違いというか、錯誤していた 前方参照も、後方参照もあったもんじゃない、一つのincludeファイルに、全てのクラスを書いて、混乱してしもうた もちついて、1ファイル、1クラスに書き直して、本の順番でヘッダーを書いて、規則通り読み込ませたら スコーンと一発でコンパイルできてもうた、全部晒してもいいが、長くて迷惑になるので、止めておくが 多少の誤植や、ミススペルは、このクラスの本になると、いたしかないかなと、思う最近なのですが、丁寧に〜.h、〜.cppはこれです なんて書いてないので、仕方ないかなと思ったりする、内容は良い本なのだけどね
850 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 23:13:03 ] 今写経していた、C++再考 第8章 オブジェクト指向プログラムにもスマートポインタの原型のような、技法が載っていたよ コピーコンストラクタで、カウンタを1増やし、デストラクタで-1してカウンタが0になったら、 オブジェクトを破棄するという、実に巧妙な仕組みだね
851 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 00:35:28 ] コピーコンストラクタ....ってなんだっけ。忘れちゃったよ、だめぽ
852 名前:デフォルトの名無しさん [2009/04/05(日) 02:50:30 ] 関数にクラスを値渡しするときに呼ばれるやつ
853 名前:デフォルトの名無しさん [2009/04/05(日) 02:51:41 ] >>846 Boost::shared_ptr使うよりも、参照にしたほうがよいということですか?
854 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 02:59:29 ] >>853 所有権の移動や共有が必要ないなら、当然。
855 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 06:56:41 ] 下のクラスをビルドして実行するとコンストラクタでvectorがエラーになります どこがまずいのでしょうか?? struct pointV { int x ; int y ; }; class Test { std::vector<pointV> vecTest ; public: Test() { vecTest.reserve(8) ; vecTest[0].x = 0 ; ←ここで発生するみたいです } }; よろしくお願いします
856 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 07:19:16 ] reserveじゃなくて、resize
857 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 07:50:26 ] reserveだと配列の大きさ自体はそのままだったんですね 有難うございました
858 名前:デフォルトの名無しさん [2009/04/05(日) 13:08:57 ] weak_ptrを使ってよかった、という例があったら教えてください。 自分的には全部shared_ptrで書いておき、問題があったら生ポインタにしちゃえば いいんじゃないか、と思ったんですが。
859 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 13:21:17 ] >>858 www.google.co.jp/search?q=boost+weak_ptr
860 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 14:25:12 ] 256の倍数を入力すると正常な数値を出してくれません 内容はVBのテキストボックスに入力した数値をマイコンに送信し マイコンに転送したCで作った制御プログラムで受け取り外部に転送するものです いろいろ考えてみましたがさっぱりわかりません。よろしくお願いします VB側 dim data(1) as Byte data(0) = CByte(inputData Mod 256) data(1) = CByte(inputData \ 256) comSerial.Output = data comSerial.Output = chr(0) /*c言語*/ /*データ受信(マイコン側のフラグ処理は省略してます*/ unsigned char receive(void) unsigned char data; data = RDR;/*PCから受け取ったデータがあるレジスタRDR return(data); int main(void) { unsigned char data[2]; int i; while(1){ i=0; do{ data[i]=receive(); i++; }while(data[i-1]!='\0'); };
861 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 14:45:50 ] >>860 じゃあためしに入力した256の倍数の値と,出力される正常じゃない値を書けよ… あとVBガワのCOMポートはバイナリ?
862 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 14:54:23 ] >>861 たとえば1000と入れるときちんと1000が出力というか1000mm動くのですか 1024と入れるとほんの少ししか動きません。 VBがフリーズするときもあります。 VB側はバイナリーです。 よろしくお願いします
863 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 14:57:07 ] 256の倍数の値ということはdata(0)は0ということなので、マイコンの動作は正常なのでは?
864 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 15:04:18 ] >>863 つまり0が送信された段階で'\0'と同じと判断されるのですね 0が怪しいとは思ったりはしましたが「NULLじゃないしな」とかいろいろ考えたりしてました データの終了判断は他の数値にした方がよさそうですね
865 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 15:05:18 ] >>862 実機ないから試せないけど,1000まではちゃんと動作確認できたと. あとは 1023 とか 1025 だとどうなる?正常? ついでにVBガワのdata()とCガワのdata[]を標準出力なりファイルなりデバッガなりで期待通りになってるか試せる? > VBがフリーズするときもあります。 なんとなくパリティかボーレートが怪しい気がする. プログラミングしてるなら分かると思うけど,"フリーズ"って種類ありすぎてどうしようもない. for(;;)でもフリーズするし,GUIならウィンドウイベント処理しないだけでフリーズしてるように見える.
866 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 15:06:30 ] >>864 そっちかー
867 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 15:38:56 ] >>865 1023と1025は正常に動作しました Cとは関係ない話になりますがPC側のフリーズは 1024で動かす→正常に動かない→他の動作をVBで実行(正転とか逆転とか) →VBの反応なくなる→タスクマネージャーで強制終了→VB再起動 →「ファイルは既に開かれています」→プロセス見るとVB6.EXEが2つ →後から起動したVB終了→残ったVB6.EXEをプロセス終了→できない こんな感じです。 C側はH8に転送してますので確認は出来ませんが VB側は出来ると思います。 手元にシステムがないので今は無理ですが。 >>864 VBの送信も悪いですが受け取るC側にも問題があるようです
868 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 16:28:42 ] >>867 VBが固まるのはMSCOMMのバグかもしれないけど,よくわからん. シリアルポートのデバッグに何か使えそうなソフトあったと思ったんだけど,忘れた/(^o^)\ データの\0は\0\0などにエスケープするようにVBとCで調整すればいいって既にやってそうですねわかります
869 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 16:50:15 ] >>858 すいません。まだやってません というか\0\0というのは2回送信してCで受け取れってことでしょうか?
870 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:08:45 ] >>869 まず仕様を確認しろよ \0(=0x00) を終端としてるようだが、それだと 256の倍数で おかしくなるのは当然に思える。
871 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:12:01 ] そうそう。例えば、inputDataが256のとき、 data(0) = CByte(inputData Mod 256) data(1) = CByte(inputData \ 256) 上は下と同じことだと忘れていない? data(0) = 0 data(1) = 1
872 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:13:52 ] まずはベーシック手順から
873 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:21:54 ] エスパーすると、do〜whileのところは data[0] = receive(); data[1] = receive(); にするのが正しいんじゃないかと思う
874 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:54:13 ] みなさんありがとうございます 実習用のテキストだけどこういう感じです(´・ω・`) >>870-871 アッー!!(;゙゚'ω゚') そうだった。1バイト文字だからを終端にしたら256の倍数だと0ですよね >>873 すいません。このプログラムは他の部分を除いて書いてるので 実は受信したデータが'O'だと次の文字見て'F'で正転、'R'で逆転みたいなことしています でも受信したデータでdo〜whileを分ければいいだけでしょうけど ちなみに数値データがある場合は comSerial.Output = chr(80)←数値データあるよ comSerial.Output = data comSerial.Output = chr(0)←データ終わり としています 入力されたデータはこんな感じです dim inputData as Integer inputData = Val(txtData.Text)
875 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:13:00 ] C++で関数のグラフを作る問題があるんですけど、 グラフィックを表示するにあたって追加でインストール しなきゃいけないものってあるんでしょうか? OSはXP、visual c++ 2005を使用しています。
876 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:16:03 ] VCありゃいける GDI使うだろうし
877 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:36:12 ] >>876 ですが教科書の通りにプログラムしても なぜか動いてくれないんですよね・・・ これが問題ありそうな5,6,7、8行目なんですけど、 void CVc31view::OnDraw(CDC* pDC) { CVc31Doc* pDoc=GetDocument(); ASSERT_VALID(pDoc); で、エラーがこう出ます。 ex3.1.cpp .\ex3.1.cpp(5) : error C2653: 'CVc31view' : 識別子がクラス名でも名前空間名でもありません。 .\ex3.1.cpp(5) : error C2065: 'CDC' : 定義されていない識別子です。 .\ex3.1.cpp(5) : error C2065: 'pDC' : 定義されていない識別子です。 .\ex3.1.cpp(6) : error C2448: 'OnDraw' : 関数の定義が間違っています。
878 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:51:24 ] >>877 CVc31view クラスの宣言はどうなってる?
879 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 13:14:25 ] >>877 たぶんその教科書の途中からやりはじめたか、教科書自体が「前章の〜参照」ってなってるだけじゃね?
880 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 13:54:04 ] int* pValue = new int[10]; pValue[1] = 10; のように配列をnewすると、 代入時に*が付かないのに変数にpが付くのがシックリ来ません。 vector使えとか、そういう話とは別に ポインタ変数にpを付けられているかたにお聞きしたいのですが、 こういう場合にもpを付けられていますか? それとも、int value = new int[10]; と書かれてますか?
881 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 14:02:57 ] 宗教論争の予感。
882 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 14:05:42 ] >>880 コーディング規約に従うだけ。 ポインタにpを付ける規約だとして、pValue[1]でもとくに違和感はない。
883 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 14:09:59 ] おれは vector 使うし、ポインタだからって p 付けたりしないし、 話には参加できないな。うれしいぜ。
884 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 14:12:42 ] >>880 その場合でも、*(pValue + 1) = 10;ならどうよ。余りに下らな過ぎるぞ。 # なんでvaluesじゃないのか、その方が気になる。
885 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 15:39:41 ] それはpointerだから
886 名前:デフォルトの名無しさん [2009/04/06(月) 20:30:01 ] クラス内に性的なメンバがあってメモリ割り当てが必要な場合、それを初期化するタイミングは クラスの外部でするべきでしょうか?
887 名前:886 [2009/04/06(月) 20:37:48 ] すいません、間違えました。 -性的なメンバ +静的なメンバ あと、この静的なメンバがいまのところprivateになっているので、外部で初期化するには publicに動かす必要があるのですが、意味的には完全にprivateなのでどうすればよいか わからずにいます。 目的としては、多数のオブジェクトを作るのですが、この静的なメンバは画像でクラス全体で 1個あればいいんですが。
888 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 20:44:33 ] 最初のインスタンスが作られるときにクラスの内側で割り当ててもいいし、そうでなくてもいい。
889 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 21:37:18 ] 性的結合..いやらしい
890 名前:デフォルトの名無しさん mailto:safe [2009/04/06(月) 22:43:42 ] >>887 静的メンバ自身のクラスのコンストラクタでやればいいんじゃないの?
891 名前:デフォルトの名無しさん mailto:age [2009/04/06(月) 23:20:39 ] スマートポインタについて最もよく解説されている本や webページを教えて下さい。お願いします。
892 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:23:47 ] 使い方の解説? 実装の解説?
893 名前:デフォルトの名無しさん mailto:age [2009/04/06(月) 23:50:57 ] 実装の解説でお願いします。 概念はある程度わかるんですが実際 どうやって実装しているのか 分からないんです
894 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:58:06 ] 検索すればでてこない・・・? boostのコードでも見たらどうか。
895 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:14:27 ] あと、スマートポインタにもいろいろあるけど、どれのこと? もっとも、基本はデストラクタでdeleteするという点は共通だけど。
896 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:26:07 ] auto_ptr
897 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:35:54 ] 質問させていただきます 変数を宣言するときに char buf[1000]; とするのと char buf_0[100]; char buf_1[100]; ... ... char buf_9[100]; として確保するのでは、必要なメモリの量は変わってくるのでしょうか?
898 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:37:02 ] >>897 やってみればいいじゃん。
899 名前:デフォルトの名無しさん [2009/04/07(火) 00:59:46 ] メモリが連続になるかならないかではないかな
900 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 01:17:09 ] Cから見えるメモリの使用量は等しいけど、 実際に必要な物理メモリの量は、コンパイラとかターゲット環境によっては違うかもしれない
901 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 02:07:25 ] >>897 CPUのアラインメントの関係で違ってくるかもしれんな
902 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 05:58:06 ] 例えば、以下のように二次元配列の確保方法はありですか? コンパイラは通ったんですが、なんか怪しいような。 そして、もしありだとして、delete 文はどのようにかけばよろしいのでしょうか? int (*p)[10] = new int [3][10]();
903 名前:デフォルトの名無しさん [2009/04/07(火) 09:53:36 ] テンプレートクラスが、std::vector<T>のメンバーを持っています。 ある程度のメモリを確保しておく処理があるのですが、assign()などを使うと 初期値を指定しないとだめなので、うまく書けません。こういうようなときに使えるような、 vector<T>を与えられた数の要素だけ確保して初期化はしない、という処理はどう書けばいいですか?
904 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 09:57:01 ] >>903 コンストラクタを実行していないクラスを生成する… 無理ぽ
905 名前:デフォルトの名無しさん [2009/04/07(火) 10:17:47 ] reserve(ほしい要素数); ってこと?
906 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 10:37:15 ] C言語でHTMLを出力したいのですが わかりやすく解説してるHPとかありますか? QueryStringのやりとりが分からなくて困ってます
907 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 10:45:44 ] >>906 pc11.2ch.net/test/read.cgi/php/1077753522/ pc11.2ch.net/test/read.cgi/php/1048393217/
908 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 10:49:58 ] アリガトン >>907
909 名前:デフォルトの名無しさん [2009/04/07(火) 11:56:23 ] VC++2008で開発しているものです。 F5で実行するたびに以下のようなMemoryManager::write()というログが出るのですが、 これはなにか問題があるのでしょうか? [ MemoryManager::write() ] totalSize = 16777216 ( 1000000 ) : 16.00MB address size file line 02FF4B04 16392 unknown 0 02FFBE14 1152 unknown 0 02FFC294 1152 unknown 0 02FFC714 1152 unknown 0 02FFF384 32 unknown 0 02FFF3A4 32 unknown 0 02FFF3C4 24 unknown 0 02FFF3DC 48 unknown 0 02FFF474 24 unknown 0 02FFF48C 24 unknown 0 02FFF514 32 unknown 0
910 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 12:02:32 ] >>909 こちらへどうぞ。 pc12.2ch.net/test/read.cgi/tech/1187922645/
911 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 12:02:34 ] ARToolKitだろ。 そういう環境ちゃんと書かないとわからんよ。
912 名前:デフォルトの名無しさん [2009/04/07(火) 14:53:46 ] ええー? そんなのインストールしてません。
913 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 17:50:35 ] >>902 その解放は、delete[] pで問題ない。
914 名前:デフォルトの名無しさん mailto:age [2009/04/07(火) 22:52:47 ] スマートポインタの一つがvectorって解釈でいいの?分からないので 質問。
915 名前:デフォルトの名無しさん [2009/04/07(火) 22:57:27 ] >>902 >>913 おれもそれが何を確保してるのかよくわからん。 int (*p)[10] = new int [3][10](); コンパイルも通るし、 913の言うように、 delete [] p; で開放できてるけど。 pはintのポインタの配列の先頭か? それが3個配列になってるのを確保したのかな? +------+------+------+------+------+------+------+------+------+------+ | int* | int* | int* | int* | int* | int* | int* | int* | int* | int* | +------+------+------+------+------+------+------+------+------+------+ <=先頭がp[0][0] +------+------+------+------+------+------+------+------+------+------+ | int* | int* | int* | int* | int* | int* | int* | int* | int* | int* | +------+------+------+------+------+------+------+------+------+------+ <=先頭がp[1][0] +------+------+------+------+------+------+------+------+------+------+ | int* | int* | int* | int* | int* | int* | int* | int* | int* | int* | +------+------+------+------+------+------+------+------+------+------+ <=先頭がp[2][0] こんな感じ? 二次元配列はC++のnewでは一度には確保できないと思ったけどな。
916 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 23:09:12 ] >>914 よくない
917 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 23:16:22 ] >>915 ttp://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=424 一応こんなのが見つかった
918 名前:デフォルトの名無しさん mailto:age [2009/04/07(火) 23:25:06 ] じゃvectorはスマートポインタじゃないんだね? 何が違うの?vectorも勝手にデストラクタ呼ばれて解放される
919 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 23:29:27 ] vectorインスタンスはポインタとして使えない。 ただ内部実装にポインタを使っているクラス。 内部ポインタにアクセスすることも可能にだけど、細かいことはおいといて。
920 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 23:35:20 ] // VC++6.0 #include <stdio.h> int main() { int (*ai)[4] = new int[3][4]; for (int i = 0; i < 3; i++) { printf("%p\n", ai[i]); } delete[] ai; return 0; } ・実行結果 00380FE0 00380FF0 00381000 ま、2次元配列も割と簡単に扱えるみたいだ
921 名前:デフォルトの名無しさん mailto:age [2009/04/07(火) 23:51:19 ] >>919 つまりvectorで確保した領域は、関数などでポインタ渡しが できないってことですね?それは不便かも・・。
922 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 00:06:51 ] クラスメンバのポインタにもアクセスすることも可能だと書いたんだけども。
923 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 00:23:43 ] vector(コンテナ)は、vector自身がコピーされれば、中身のメモリ領域も丸ごとコピーされる。 スマートポインタは、スマートポインタ自身がコピーされても、中身のメモリ領域は丸ごとコピーされない。 メモリ領域は2つのスマートポインタで共有される。 みたいな。
924 名前:902 mailto:sage [2009/04/08(水) 01:41:17 ] >>913 ,917 どもです。 同様の方法でクラスの二次元配列も作ってデストラクタの動きを見てみましたが delete [] p; でちゃんとできてました^^
925 名前:デフォルトの名無しさん [2009/04/08(水) 06:11:47 ] >>924 本当だ。 この方法で、3次元配列も出来た! しらんかった。 あと、後ろの括弧は無しでも問題ないようだけど。。。 なんでこれで出来るのか、よくわからん。 でもサイズチェックもないし、各次元ごとのサイズも覚えてないし、 あまり使い道はないかも。
926 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 08:12:35 ] VC++.NETを使ってツールを作成しています。 ダイアログバーを複数(一部ドッキング可能なもの含む)最初にCreateして、 それをShowControlBar関数を使って消したり出したりしているのですが、 表示の奥行き順(Zオーダーというのが正しいのでしょうか)がCreateした順番のまま、 変わってくれません。ダイアログバー二つを重ねるとどっちをクリックしても表示順番は変わりません。 クリックしてアクティブにした方を前に出し、なおかつ大元のMainFrameよりは総て必ず前面を維持するには どうすればよいでしょうか? 知識の引き出しが少なくて、ネットで調べようにもどうにも自分の求める答えにたどり着けません。 よろしくお願いします。
927 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 09:47:39 ] 意外と難しいかもな DialogBarにEditBoxがある場合、それに入力フォーカスを当てると自動的に前面に出る 逆に言えば入力フォーカスが移らない限り前面には出てこない NcHitTestとかで強引に入力フォーカスを奪うとか工夫が必要かも
928 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 10:22:39 ] MainFrame を owner にして ダイアログバーを Create すれば良いんでないの?
929 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 10:23:54 ] Spy++でDialogBarへのメッセージを監視し、背面時にタイトルバーをクリックしたら S WM_NCHITTEST x y R WM_NCHITTEST HTCAPTION S WM_MOUSEACTIVATE HTCAPTION WM_LBUTTONDOWN R WM_MOUSEACTIVATE MA_NOACTIVATE という感じになったので WM_MOUSEACTIVATEのメッセージハンドラを作ってMA_ACTIVATEを返せばいいんじゃないかと思う
930 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 11:23:14 ] DialogBarにメッセージハンドラを追加してみたが メッセージが思うように飛んでこないので調べてみると ttp://www.ne.jp/asahi/hishidama/home/tech/vcpp/dlgbar.html ダイアログバー上のイベントが、CDialogBarクラスまで来ないようだ。 したがって、イベントはCChildFrameで処理しなければならない。 CChildFrameをサブクラス化するなりしないとならないようだ やれなくはないが、もっと簡単な方法はないだろうか・・・
931 名前:926 mailto:sage [2009/04/08(水) 12:25:22 ] 色々教えていただきありがとうございました。 >>927 おっしゃる通り、隠れているダイアログバーのオプションボタンなどをクリックすると フォーカスは移りました。 >>928 元々ダイアログバーCreate時にthis(MainFrame)を指定してあるのでこれは満たしていると思います。 >>929 Spy++というツールの存在すら意識した事が無かったので使ってみました・・がよく分からなかった・・。 ただツールをしるきっかけを教えていただきありがとうございます。 >>930 教えていただいたURLを参考に一歩ごとに苦戦しながら作ってました。 試行錯誤した結果、対象ダイアログバーのクライアント領域をクリックした時の マウスダウンイベントを拾える事を確認したので、そのイベント検知時に this->SetFocus(); ・・・ダイアログバーのクラス内 をする事で、タイトルバー以外は思い通りの挙動にする事ができました。 これで今は妥協することにします。ありがとうございました。
932 名前:デフォルトの名無しさん [2009/04/08(水) 18:27:59 ] a<<1とa<<=1の違いを教えてください。
933 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:30:25 ] 実行後のaの内容が違う a<<=1 は a = a << 1
934 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 19:26:37 ] >>925 後ろの括弧とはdeleteの右の[]のこと? intなどなら無くても上手くいく処理系もあるが、一般的には省略してはいけない。 デストラクタを持ったクラスでやると、デストラクタが呼ばれないので分かりやすい。
935 名前:デフォルトの名無しさん [2009/04/08(水) 21:03:45 ] 最近Visual C++ 2008を使い始めたものです。 あるライブラリを使ったコードをコンパイルしていると大量の警告(C4996)が出ました。 #define _SCL_SECURE_NO_WARNINGS をソースに書けばでなくなるのですが、ソースが大量にあり、それらから一括してインクルード されているヘッダとかもないので、プロジェクト単位(またはソリューション単位)で指定したい のですが、どうやればいいのでしょうか? どうかよろしくお願いします。
936 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:12:31 ] コンパイラオプションに /D_SCL_SECURE_NO_WARNINGS を指定する
937 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:26:56 ] >>934 int (*p)[10] = new int [3][10](); の最後の()のことじゃない?
938 名前:デフォルトの名無しさん [2009/04/08(水) 21:27:13 ] >>936 ありがとうございます。 コンパイラオプションってどこで指定できますか? プロジェクト→プロパティの中じゃないかと思うんですが、どこかわかりませんでした。
939 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:54:34 ] 質問です。 一般的なMFCのウィンドウを表示するアプリで、独自にスレッドを生成して とある処理をしています。ウィンドウにフォーカスがある時より、ない時の ほうが、独自スレッドが回る回数が多いのですが、これは一般にどういう 理由なんでしょうか? ちなみに、ツールバー・メニューバーの表示を更新する系の関数、OnUpdateXXXが 独自スレッドと同期を同期(critical section)を取っているため、これが原因かとも 思いましたが、特に過剰に呼ばれているわけでは無さそうでした。
940 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:20:28 ] >>938 ツリービュー:構成プロパティ→C/C++→プリプロセッサ 構成:すべての構成 プリプロセッサの定義(/D[マクロ]) _SCL_SECURE_NO_WARNINGS
941 名前:デフォルトの名無しさん [2009/04/08(水) 22:21:05 ] ttp://www.01-tec.com/document/without_pointer.html ここの、●バグその3「'\0'終端」 のサンプルプログラムの事なんですが、 #include <stdio.h> /* puts() */ #include <string.h> /* strcat() */ int main() { char buff[128] ; strcat( buff, "ABC" ) ; puts( buff ) ; /* ABCと表示したい */ return 0 ; } buffに終端NULLが入っていない為、putsの表示がうまくいかない事が このプログラムの意図するところらしいのですが、"で囲まれた文字列には 暗黙的に'\0'が付加されるのでこのプログラムのように strcat( buff, "ABC" ) ; としても問題ないですよね?
942 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:25:00 ] 構成:すべての構成 にするとまずいんで(WIN32やら_DEBUGが消えてしまう) Debug Release それぞれに _SCL_SECURE_NO_WARNINGS を追加で
943 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:31:21 ] >>941 C言語の文字列では,終端記号があることを前提にしています。 しかし,charの配列を確保しただけでは文字列として初期化されているわけではないのです。 以下の例は,終端記号の存在(文字列としての初期化)を忘れたために失敗してしまった例です #include <stdio.h> /* puts() */ #include <string.h> /* strcat() */ int main() { char buff[128] = ""; // こうすればおk strcat( buff, "ABC" ) ; puts( buff ) ; /* ABCと表示したい */ return 0 ; }
944 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:32:38 ] >>941 ちゃんとそこ読んだのか? strcat()の呼び出し時点でbuffは'\0'終端文字列でなければならないが、 buffに'\0'が入っている保証はどこにもない
945 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:42:19 ] >プログラマの都合よく '\0' で初期化されているわけではないのです。 初期化されないのは仕様だしな(スタックポインタを加減するだけ) 高級アセンブラは使う人を選ぶ
946 名前:デフォルトの名無しさん [2009/04/08(水) 22:47:38 ] >>944 ,943 ありがとうございます、 自分の環境(gcc4.2.4)で、普通にABCと表示されていたのは たまたま、配列buffがプログラマの都合よく '\0' で初期化されていたのでうまく動作していた という認識で良いでしょうか
947 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:49:25 ] C++ は「高度な抽象」とか「型安全」とかいうくせに ライブラリからは「低レベルな詳細」や「型安全でない変換」が透けて見えるじゃないか。 どういうことなんだ。ぷんぷん。
948 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:50:19 ] どちらもできる柔軟な特性と前向きに捉えてみる
949 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:05:04 ] C++はbetterなC オブジェクト思考したいならJavaをやれ C#・・・何それ?
950 名前:デフォルトの名無しさん mailto:age [2009/04/08(水) 23:14:55 ] C#はVBみたいなもんだよな。
951 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:19:37 ] C#使うぐらいならVBのほうがいいよ
952 名前:デフォルトの名無しさん [2009/04/08(水) 23:21:17 ] >933 ありがとうございます。 昔そんなことを習ったような気がします。
953 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:21:31 ] VBなんか死んでもやらない。理由は無い。
954 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:50:21 ] 「無い」というのも立派な理由だよ
955 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:58:29 ] 同じ.NET frameworkを使っているだけで、VBとC#を一緒にするのはないわ
956 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 00:04:13 ] 似たようなもんだけどな。
957 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 00:41:18 ] VB.netとC#は似たようなもん。
958 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 02:11:18 ] >>947 言語のせいじゃないだろ。ライブラリの作者に文句言え。
959 名前:デフォルトの名無しさん mailto:age [2009/04/09(木) 07:52:07 ] 困っています。 www.kattch.com/~kattch/MySQL/06_3.html fedoracore4でC言語とMySQLを接続しようとしているのですが、 実行するとセグメンテーションエラーが出ます。 record = mysql_fetch_row(result); の mysql_fetch_row関数を使用しているところで落ちているのは 判ったのですが何が原因か判りません。 コンパイル時の指定が間違っているような気がしますが わかる人がいたら教えてください。 関係ファイルのパス /usr/include/mysql/mysql.h /usr/lib/mysql/libmysqlclient.so /usr/lib/mysql/libmysqlclient.a コンパイル gcc -o mysqlclient \ -I /usr/include/mysql/ \ -L /usr/lib/mysql/ \ -l mysqlclient \ mysqlclient.c ソースファイル mysqltest.c
960 名前:959 mailto:age [2009/04/09(木) 07:53:41 ] 追記。 count = mysql_num_rows(result); の部分でも落ちます。
961 名前:959 mailto:sage [2009/04/09(木) 08:02:44 ] ソースファイルは mysqltest.cではなくmysqlclient.cの間違いです。
962 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 08:20:45 ] result = mysql_store_result(&mysql_buf); ← SQL回答領域ハンドルの取得 このハンドルでエラーになってる可能性が高いな
963 名前:959 mailto:sage [2009/04/09(木) 08:29:51 ] >>962 解決方法とか……何かあるでしょうか。。。
964 名前:959 mailto:sage [2009/04/09(木) 09:01:17 ] >>962 おっしゃる通り、取得に失敗していました。 if(result = mysql_store_result(&mysql_buf)){ } else { printf("QUERY Error\n"); }
965 名前:959 mailto:sage [2009/04/09(木) 09:19:30 ] >>962 判った!!!!!!!!!!!!!!!!!!!!!! ありです。ばかやってました。
966 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 09:30:25 ] >>963 ソースもなしで他人のデバッグなんかできませんが。 それとも、デバッグのノウハウを0から教えろと言うことでしょうか。
967 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 09:41:09 ] esp
968 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 10:08:03 ] 関数の戻り値チェックはちゃんとしましょうということだろ
969 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 11:26:47 ] PHPからCをCからPHPを呼び出す、もとい実行する方法ってある?
970 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 11:40:46 ] >>969 systemやexec系の関数で出来るだろ
971 名前:デフォルトの名無しさん [2009/04/09(木) 12:01:34 ] そろそろ1000か。ところで、このスレの過去ログを全部保存しているサイトとかってないのかな? 時々ググって引っかかったけどdat落ちしてたりとか、過去のこの辺で出てたよな、とかそういうの あるんだけど。
972 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 12:03:17 ] 過去ログ見ろとか言われても困るよなw
973 名前:デフォルトの名無しさん [2009/04/09(木) 12:57:43 ] boost::shared_ptr<Test> MemberFunction(); boost::shared_ptr<Test>& MemberFunction(); あるクラスが、内部にTestのスマポを持っていて、それを返す関数があるとします。 (名前はMemberFunction)。 このとき、参照で返すのと、実体で返すのとは、どう違うでしょうか? 自分は、スマポを返す場合は参照以外はないと思ってたんですが、実体を 返すことに意味はあるでしょうか?
974 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 13:14:58 ] 参照を返したら外部からインスタンス内部のポインタをresetできる。 コピーインスタンスを返したら、外部のスマポは外部のポインタだけ変更できる。
975 名前:デフォルトの名無しさん [2009/04/09(木) 13:20:34 ] >>974 外部から触って欲しくない時にはコピーインスタンスを返すべきということですか? でも、そうなると内部で保持しているスマポはboost::scoped_ptr<>を使うべきでは ないですか?
976 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 14:42:25 ] scoped_ptrだと、呼び出し元がポインタを得た後、「あるクラス」のインスタンスが変更受けた場合に、 呼出し元が破棄されたポインタを持たされる危険がある。 というか内部実装にscoped_ptrを用いる場合はTestをコピーして返すべき。 そもそもスマポは、Testインスタンスを参照する手段であって、 MemberFunctionもTestを渡すのにスマポを用いてるだけで、Testの参照の参照を返すのは本来的に無意味。
977 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 20:46:08 ] スマポってセマンティクスはポインタだからな Test*& MemberFunction(); と同じ事をしようとしてる
978 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 20:57:10 ] >>975 コピーをお前はTest自体のコピーと考えているように見えて、 974はshared_ptrのコピーのことを指しているように見えるぞ。
979 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:17:13 ] &じゃなくてconst&ならありなんじゃね? 値をコピーすると参照カウンタの操作が入って遅いだろうし。
980 名前:975 [2009/04/09(木) 22:10:14 ] でもスマポ(特にboost::shared_ptr<>)の参照を返すコードって結構ないですか? スマポのコピーって本当に遅いし。測ったら普通のポインタのコピーより 30倍近く時間がかかってました。 でも本当は無意味で、979さんの言うとおりconst&の時だけ意味があるのかな?
981 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:02:14 ] 速度を本当に気にするような場面ならそもそもスマポを使うな。 しかし、ほとんどの場合においてスマポのコピー程度の時間は全く問題にならない。 30倍と言うが、ポインタのコピーなんて機械語で一命令になるかならないかのレベルなんだから、 それが30倍になろうとも余程の大量コピーでない限り全く気にならない。
982 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:06:31 ] shared_ptrの参照を返すことなんてまず無いな。むしろコピーしてなんぼだ。 そもそもオブジェクトが何かの参照を返す事自体問題がある。
983 名前:975 [2009/04/10(金) 01:02:41 ] そうなんですか。。。 実は自分が今やってるプロジェクトでは、boost::shared_ptr<>&返し (スマポの参照返し)を使いまくってて、自分もそれに合わせて書いてるんですが、 最初にスマポの参照返しを使い始めた人はもうプロジェクトにはいないし、 なんでかなとおもってたのですが。、。
984 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 01:24:38 ] スマポの参照返すくらいなら普通に参照返せばいいんじゃ?
985 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 01:37:00 ] ぬるりーは怖いぜよ
986 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 02:03:51 ] 返ってきたスマポの参照が本当に有効なスマポを指してるのか 知らない間に外からいじくられないか いつまで生きてることが保証されてるのか そもそもスマポってこんなこといちいち気にしたくないから使うもんのはずだ 危ないことしたくないからわざわざ重いスマポ使ってるのにそんなことするなんて ストーブ炊いて暑いからってクーラーかけるようなもの 馬鹿げてる
987 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 02:26:16 ] ぬるぽは怖いぜよ
988 名前:975 [2009/04/10(金) 06:56:20 ] じゃあやっぱり最初にスマポの参照返し使いまくりをはじめた人に聞いてみたほうがいいのかな。。。 ソースを見る限り、間違いなくC++の達人だと思ったので、そのやり方にしたがってれば間違いない と思ったんだよな。 ちょっと聞いてみます。
989 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 07:25:22 ] 30倍遅いっても怪しい感じだな そんなに遅くなるか? 誰か試してくれ
990 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 07:28:34 ]
991 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 08:19:19 ] shared_ptrなら、コピー時の参照数の管理コストを無視できない、かも。