1 名前:デフォルトの名無しさん [2008/09/06(土) 22:45:12 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.58【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1218023777/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
511 名前:デフォルトの名無しさん [2008/09/27(土) 08:03:10 ] char配列でおねがいします
512 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 08:32:29 ] >>511 ただのバイト列だからなんでも入るよ
513 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 08:51:14 ] >>509 charは只の8bitの数値。それをどの文字コードで解釈するかってこと。 文字コード表を比較してください
514 名前:デフォルトの名無しさん [2008/09/27(土) 13:43:04 ] dクス
515 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:38:26 ] クラスが保持するstaticメンバ関数から 同一クラスのprivateメンバ変数へアクセスできない 書き方が悪いのか、それともそういうもんなの?
516 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:54:48 ] 実体を渡せよ thisとか
517 名前:デフォルトの名無しさん [2008/09/28(日) 03:10:16 ] >>515 class AAA { private: int m_a; public: static void func(int arg, AAA* pinst); }; void AAA::func( int arg, AAA* pinst) { pinst->m_a = arg; } こんな感じか
518 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 04:00:18 ] struct Hoge { Hoge() {} Hoge(const Hoge&) { Sleep(1000); } Hoge& operator=(const Hoge&) { Sleep(1000); return *this;} }; もしこのくらいコピーにコストがかかるクラスをSTLのコンテナに入れる場合、どうするのが良いですか。 特にvectorだとpush_backしていくうちに、サイズ増やすために全部コピーしたりしますよね。(listだとそういうことはないのでしょうか) ポインタ(std::vector<Hoge*>とかstd::vector<std::tr1::shared_ptr<Hoge> >)で管理するのが普通ですか。
519 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 05:00:37 ] >>518 listやset、mapはpush_back(insert)しても新たにコピーされることは無い ただまぁvectorと同じようには使えないので、boost::ptr_vectorあたりがお手軽か?
520 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 08:00:28 ] >>518 そのとおり、shared_ptrが無難
521 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 20:52:45 ] クラスAのメンバの配列を動的確保できるようにnewとdelete用の関数を作りました。 そうするとクラスAに全く関係のないクラスBのメンバの値がおかしくなりました。 調べていくと、 クラスBのコンストラクタで初期化完了 ↓ クラスAのコンストラクタでnewを使う ↓ クラスBのメンバの値がおかしくなる という流れでした。 これは何が原因なのでしょうか? ちなみにクラスAのnew用関数ではクラスBは全く使用していません。
522 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:01:43 ] クラスBのデストラクタにブレークポインタ打ってみそ
523 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:08:37 ] >>522 プログラム終了時のみにしか呼ばれてませんでした
524 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:09:04 ] new用関数て? operator new のオーバーロードをしてるわけじゃないよな
525 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:12:00 ] クラスBのインスタンスをウォッチしながらステップ実行してみそ
526 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:13:28 ] >>524 多次元配列なのでまとめてるんです void New() { int i;; for(i = 0; i < MAX; i++) p[i] = new int [SIZE]; } こんなのです
527 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:15:24 ] 全く関係ないところでスタックやヒープを壊してる悪寒
528 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:23:12 ] >>525 ググって見たんですけどやり方が今一分かりませんでした。 クラスA・Bどちらのインスタンスもグローバル変数でクラスBのほうが先に作られます。
529 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:23:20 ] >>526 pの領域は確保してるか?
530 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:33:09 ] >>529 pは int *p[SIZEX]; と宣言してます。
531 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:41:51 ] >>528 VisualStudioだったら、ウオッチにCLASS Bのインスタンスを表示させてステップ実行すると、値が変わったところで赤くなる。
532 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:51:48 ] >>531 クラスAのコンストラクタでnew用の関数が終わったときに値が変わりました。 原因がつかめないのでnewする前にクラスBの値を保存しておいて終わったらそれを代入することにしました。 皆さんありがとうございました。
533 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:12:57 ] 領域が重なってるんだヤバイ状態だ。 解決してから進まないと、あとで手が着けられない状態になるよ
534 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:13:29 ] >>532 MAX > SIZEX になってない?
535 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:22:12 ] >>534 思いっきりなってました・・・ 何で気づかなかったんだろう・・・ 直したら正常になりました。 ありがとうございました。
536 名前:デフォルトの名無しさん [2008/09/29(月) 01:08:29 ] Visual C++ 2003 MFC利用 でExcelファイルの読み書きをexcelのtypelibを使って行っているんですが、 CRangeオブジェクトのメンバ CString get_Address(VARIANT RowAbsolute, VARIANT ColumnAbsolute, long ReferenceStyle, VARIANT External, VARIANT RelativeTo) のReferenceStyleに設定すべき定数がどこにあるのかわからず困っています。 XlReferenceStyleをxlA1にすれば良いらしいのですが。 CRangeの"C8"などのアドレスを返す代替手段があればそちらでもかまわないです。 他の部分はほとんどなんとかなったんですがこれだけどうしようもないです。 よろしくお願いします。
537 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 10:10:33 ] >>508 インポートライブラリを作るってこと?できるよ。 環境によって違うけど。
538 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 12:01:34 ] fstreamでパスに日本語を含むファイルを開けないんですが、 std::localeとかimbue()つかってもダメで探してもlocaleのことしか見つかりません。 環境はVC2008使ってるけどやはりVCのバグ?fopenとか_openとか使えってことですかね?
539 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 12:05:07 ] ワイド文字版のコンストラクタを使えばいいよ
540 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 12:22:23 ] ストリーム関連のライブラリは設計段階でダメダメなので使わないほうがいい。 何しろ、一文字は7bitであるという前提が頭からこびりついて離れない西側諸国の連中が作ったんだから。
541 名前:538 mailto:sage [2008/09/29(月) 12:24:00 ] wfstreamでもダメだったんでやはりCライブラリですか
542 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 12:29:31 ] >>541 wfstreamはファイルの「中身」をワイド文字で読み書きしたいときに使うんだ ファイル名の問題とは関係ない つうか>>539 嫁 VC8以降は、fstreamにワイド文字版コンストラクタがあるんだよ
543 名前:541 mailto:sage [2008/09/29(月) 12:34:34 ] つまりfstreamのインスタンス作成のときにアドレスをワイド文字で渡せばおkということですか
544 名前:543 mailto:sage [2008/09/29(月) 12:54:55 ] できましたー >>542 ご指摘ありです。 >>539 理解できてなくてすません。 ところでVC8以降ってことはVC依存のコンストラクタ?他のビルダーとかだとマルチバイトで指定してもおk?
545 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 13:02:17 ] >>544 少なくとも非標準 他の環境でも利用したいのならboost使え
546 名前:544 mailto:sage [2008/09/29(月) 13:14:55 ] なるほど了解しました。
547 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:39:12 ] C++…というかC言語自体が初心者です。 C++の開発環境で、PCに『Visual Studio 2005』が入っていたのでそれを使おうとしたのですが、いまいち上手く使えません。 Visual Studio 2005 について解説しているサイトを見ながら設定し、それにのっているプログラムを丸写ししてみたのですが、ビルドが上手くいかなかったり、実行してもエラーが出たり出なかったりでよくわからない状態です。 これ以外で無料で使えて、それでいて使いやすい開発環境はありますか?
548 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 15:19:22 ] あきらめた方がいいよ
549 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 15:39:47 ] 開発環境のせいじゃないだろ。 一歩ずつ進めてみては
550 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 20:20:09 ] >>547 VS2005は簡単な部類だからあきらめないでね。
551 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 20:23:04 ] >>547 2008を入れて、この本を買いなさい。 www.amazon.co.jp/dp/4891005823 www.amazon.co.jp/dp/4891005769
552 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 20:25:45 ] なんか昔アカデミックのおまけについてたような本だなw
553 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 20:56:57 ] そういうツールの解説本は例外なく糞だ。 買うならこれだ。 www.amazon.co.jp/dp/0470843993
554 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 21:01:45 ] コンパイルができないってのは、独学者がぶつかる最初の壁だろ。 周囲に訊く人間がいなかったら、バカっぽくても画面写真が載りまくりのような本を見るしかない。
555 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 21:19:19 ] その辺は、まともな本ほど載ってないような話題だしな
556 名前:536 mailto:sage [2008/09/30(火) 00:40:35 ] 自己レスです。 enum XlReferenceStyle { xlA1 = 1, xlR1C1 = -4150 }; でした。全て解決しました。
557 名前:デフォルトの名無しさん [2008/09/30(火) 03:31:12 ] クラス名をつけたらコンストラクタ出来ますが、クラス名無しで変数だけ定義したら コンストラクタは出来ませんか?
558 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 03:34:39 ] 日本語でおk
559 名前:デフォルトの名無しさん [2008/09/30(火) 03:47:13 ] class cls{ int a; public: cls(){・・・} }; というクラスを class { int a; public: } hensuu; と書いた場合に、初期化が出来るか教えてください
560 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 04:12:46 ] それを構造体にしない理由は?
561 名前:デフォルトの名無しさん [2008/09/30(火) 07:25:39 ] >>560 後者にコンストラクタは定義できませんか? 構造体にしないのは初期化したいからですよ。
562 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 07:27:22 ] >>561 構造体にすれば初期化できるよw
563 名前:デフォルトの名無しさん [2008/09/30(火) 07:29:54 ] 初期化は、代入だけとは限らないですが出来ますか? 普通のプログラムも掛けますか
564 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 07:43:16 ] POD(Plain Old Data)の定義からも、 PODの初期化のルールからもはずれるから初期化されないと思う。 第一privateなint a;はどこからもさわれない、そこで警告なりなりラーなりになるような。
565 名前:デフォルトの名無しさん [2008/09/30(火) 07:47:18 ] クラス名を付ければ、初期化出来ますけど、クラス名無しだと初期化は無理って事ですか?
566 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 07:57:35 ] クラス名のあるなしは関係ない。 グローバル変数としてhensuuがあったら初期化ずみ。 ローカル変数としてhensuuがあったら未初期化。 このへんは普通の変数と同じ考え方でいい。 あとはPODでググる。PODならnewを使った場合にコンストラクタなしでも初期化される。 それから新規の質問以外はsageる。
567 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:07:47 ] struct { int id; char *name; } table[] = { { 0, "zero", }, { 1, "ichi2, }, }; が出来るのだから デフォルトの公開性が違うだけのclassでも class { public: int id; char *name; } table[] = { { 0, "zero", }, { 1, "ichi2, }, }; と出来るだろ。 やったことないけど。
568 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:14:06 ] >>567 そこまで書いたらやってみればいいよwww
569 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:15:04 ] それでいいはず。 なんでint a; が何でprivateなのだろ。 publicならPODだから、newやhoge xx = {} で初期化可能になる。
570 名前:デフォルトの名無しさん [2008/09/30(火) 08:18:42 ] 初期化っていうのはコンストラクタを起動出来るかという質問です。 class cls{ int a; public: cls(){a=10;} }; っていうのは出来ますけど、クラス名無しだと標準のコンストラクタ名が使えないですけど なんとか出来ますか?っていう質問です。
571 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:21:59 ] 無名ではコンストラクタは指定できない。メンバーをpublicにする。以上。
572 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:28:57 ] >>570 つーかいちいちあげるな
573 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:30:28 ] >>570 無名クラスではコンストラクタは作れないです もし名前空間を汚染したくないだけであれば無名名前空間を使うのも手です
574 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:43:28 ] トンクス
575 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 09:22:14 ] すみません質問良いでしょうか。 関数chk()の戻り値がFALSEになるまで待つにはどうしたらいいですか?
576 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 09:26:52 ] なるべくCPUを使わず、即座に進める方法おねがいします。
577 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 09:40:57 ] 自己解決しました。 関数の戻り値を監視するには、定期的に関数を呼び出すしかないようですね。
578 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 12:26:27 ] >>577 戻りが変わった可能性があることをイベントを使って検出してから見にいくといい。 OSのAPIにはそういうイベント関係の関数が多数ある。
579 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 12:36:18 ] >>570 PODをクリアするテンプレートクラスを作って、それをクラスに所有させる。するとデフォルトコンストラクタで初期化できるようになる。 template<class T) class tclear { T a; public: tclear() :a(0) { } }; class X { tclear<int> a; };
580 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 15:54:03 ] ICL10.1(win)でXP32bit用アプリ?をゴニョゴニョしてるんだけど、 SSEのインラインアセンブラとか組み込み関数を使うと、/archとか/Qxとかに関わり無くなぜか勝手に拡張命令を使うみたいなんで困ってます>< インラインアセンブラはともかく組み込み関数は汎用命令で何とかしてくれると思ってたのに・・・ 汎用命令以外吐かないようにする方法を教えてください、よろしくお願いします。
581 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 17:28:52 ] もうSSEの無い環境なんて切り捨ててもいい時期に来てるってことだろ。
582 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:14:32 ] そうだな C3 だとハングアップするソフトも結構あるしな ><
583 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:23:58 ] いや、SSE2未満なら切捨てでいいと思うけど オレが使いたいのはSSSE3(_mm_hadd_epi16)までなんでチョットまずいかなと・・ 俺自身SSSE3が動かないPCも使ってるし困るんです>< てかQaxがマトモに機能してれば困らない事に気付いたよ!! ICLがコピーと論理演算位しかベクトル化してくれないのが全部悪いんだ!!! 型が複数あると出来ないとか、無理矢理全部intでやったら複雑すぎとかふざけてるとしか思えない てことで普通の自動ベクトル化があるコンパイラ教えてください、お願いします。
584 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:35:54 ] 空の書き込み可能なテンポラリディレクトリを確保する命令ありますか? WindowsXPです。
585 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:38:29 ] GetTempFileName()のフォルダ版ないですか? 存在していない空のフォルダを作りたいのですが
586 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:51:20 ] 同じ名前のファイルとフォルダは同時に存在できない。
587 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:01:53 ] GetTempFileNameで取った名前使ってディレクトリ作れば?
588 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:16:51 ] >>587 それは無理。 GetTempFileNameの作ったファイルを消してディレクトリを作らないといけないから、 その間に他のプロセスに割り込まれる可能性がある。
589 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:15:32 ] これで出来ました。 GetTempdir(){ wchar_t w[1000], z[1000]; GetTempPathW(1000, w); if(!GetTempFileNameW(w, L"aa", 0, z) ) { wcscpy(w,L".\\temp\\"); CreateDirectoryW(w,NULL); if(!GetTempFileNameW(w, L"aa", 0, z) ) wcscpy(w,L"c:\\temp\\"); CreateDirectoryW(w,NULL); } wchar_t ch[9]; for(int n=0;n<100000;n++){ swprintf(ch,L"aa%06d",n); wcscat(w,ch); CreateDirectoryW(w,NULL); if( (GetFileAttributesW(w)&FILE_ATTRIBUTE_DIRECTORY) )break; w[wcslen(w)-8]=0;} }
590 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:26:38 ] まちがえました wchar_t ch[9]; for(int n=0;n<100000;n++){ swprintf(ch,L"aa%06d\\",n); wcscat(w,ch); int flg=GetFileAttributesW(w); if( flg==-1 || !(flg&FILE_ATTRIBUTE_DIRECTORY) ) {CreateDirectoryW(w,NULL); break;} w[wcslen(w)-9]=0;
591 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:30:25 ] GetTempdir が使われてないのと>>588 の意見を全つっぱした理由が気になるな
592 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 04:40:03 ] GetTempFileNameはファイル作らないよ?
593 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 21:41:36 ] >>592 作ったり作らなかったりする。 MSDN嫁あほ
594 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:21:58 ] C++なんですけど、(Cも同じでしょうか) グローバル変数でstatic付けるのと付けないのと、どんな違いがあるのでしょうか。
595 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:28:51 ] >>594 その名前がコンパイル単位の外から見えるかどうかが変わる。 C++ では無名の namespace に入れるのが推奨されてる。
596 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:34:01 ] >>594 つけると静的になり、ファイルスコープになる。 つまり、外部に公開しないで済む。
597 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 04:58:54 ] template< class T > class Base を継承したクラス Derived を作りたいのですが クラス定義はどのように記述すればいいんでしょうか?
598 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 05:15:16 ] template<class T> class Deriv : public Base<T> こうだろうか?
599 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 05:19:28 ] #include <iostream> template <class T> class Base { T a; public: Base(T b) : a(b) {} void print() const { std::cout << a << std::endl; } }; template <class T> class Derived : public Base<T> { T c; public: Derived(T a, T b) : Base<T>(a), c(b) {} void print() const { Base<T>::print(); std::cout << c << std::endl; } }; int main() { Derived<int> d(1, 2); d.print(); }
600 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 06:48:15 ] おふっ。 できました。ありがとうございます。
601 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 09:35:56 ] 例外を扱うとき場合 実行中どういう例外を吐いたかログを取るような仕組みを組みこんだりするのでしょうか? その場合、どういう方法でログ取りの仕組みを実装するのがよいでしょうか?
602 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 10:29:09 ] SYSLOGでも利用すれば
603 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 16:47:32 ] イベントログも使えば
604 名前:594 mailto:sage [2008/10/02(木) 18:21:18 ] >>595-596 ありがとうございます。 staticはローカル変数でしか使ったことがなく、ちゃんと理解してませんでした
605 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:31:59 ] まあ、まず使わん仕様だがな。
606 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 19:44:00 ] 質問があります。私は今WindowsGUIプログラムで、WinMainのスレッドでGUIの処理、別に作ったスレッドで ファイルへの書き込みを行っています。一定時間間隔で複数のデータをサンプリングしてファイルへ書き込んで いるのですが、メインスレッド終了時に、同時刻上のデータがすべて書き込み終わっている様にしたいのです。 ファイル書き込みスレッドを終了させた場合、どこまで処理を終えているのか確定できませんが、どのようにコントロール するのが一般的なのでしょうか。よろしくお願いします。
607 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 19:46:01 ] >>606 fflush 相当のことをすればいいんじゃないかと
608 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 19:57:36 ] >>606 書き込みスレッドにイベントを送って、書き込みスレッドがファイルをクローズしその後スレッド終了するようにすればいい。それを待ってwinmainのスレッドを終了させる。
609 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:00:18 ] イベントについて調べたところ、これで大丈夫そうです。ありがとうございました。
610 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:52:18 ] クラスをリスト化してるのですが クラスの一番最初のメンバ変数をsortを使って 昇順や降順に変更したいと思っています 何かいいやり方はないでしょうか?
611 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:55:20 ] reverseのが早いんじゃない? 使えるリストなのかは知らないけど
612 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:55:44 ] >>610 STLを使おう
613 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:57:42 ] >>609 豆知識 スレッドの実行が終わると、スレッドのハンドルがシグナル状態になる。結構便利
614 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 23:27:10 ] 豆知識ていうか必須知識だろ
615 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 23:37:04 ] >>606 文章の酷さが気になった もう少し読み書きしようぜ
616 名前:デフォルトの名無しさん [2008/10/03(金) 02:04:13 ] int hoge(int a) { return a++ * ++a; } という関数があるときに hoge(5) とすると、Return値は5×6で30になると思ったんだけど、g++とVC++の両方で 答えが36になりました。これってどうしてでしょうか? どうかお願いします。
617 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 02:20:56 ] >>616 それは未定義動作なのでそういうコードは書いちゃいけないけど、 あえてコンパイラの気持ちを大便するなら、 1. a++を発見。「評価後にaの値を+1する」と覚えておく 2. ++aを発見。「評価前にaの値を+1する」と覚えておく 3. コード生成開始 4. 評価前なのでaの値を+1するコードを生成 5. a*a のコードを生成して、その結果が返り値となるようにする 6. aの値を+1するコードを生成する。意味がないから最適化で削除されるかも。
618 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 02:23:42 ] 水に流せってことですか
619 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 03:35:14 ] 変な物を放り込むと詰まるという意味も
620 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 04:08:33 ] template < class T > class Hoge; で const の T を受け取った時に、 クラス内部で非 const な T 型を使いたい場合には どうすればいいんでしょう? 例えば Hoge< const string > というように呼ばれたとき、 内部で(非 const な) string 型を扱いたいのです。
621 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 07:54:20 ] >>620 boostのtype_traitsにconstを外した型を返せる remove_cってのがある。 ttp://www.kmonos.net/alang/boost/classes/type_traits.html 手法としてはtemplateの特殊化で行ってるらしい。
622 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 07:55:16 ] すまん、remove_constだね
623 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 08:36:56 ] サンクスです。boostが必要ということは もともと const 修飾された型から 非 const の型を特定するのは 難しいプログラム技術が必要だってことなわけですね・・・。 自作のiteratorを作ってたんですが、こりゃー自分には無理かな。・_・
624 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 08:59:29 ] >>623 いや、試してないけど実装はたったこれだけで良いっぽいよ。 // remove_const : const修飾の除去 //非constが渡されたらこれが実体化 template <typename Type> struct remove_const { typedef Type type; }; //constの場合はこちらが実体化 template <typename Type> struct remove_const<Type const> { typedef Type type; }; //用例 remove_const<const int>::type i; //constが外れる
625 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:00:15 ] >>617 未定義動作じゃなくて不定動作だろ。 a++と++aの評価順が決まってない。
626 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:08:18 ] >>617 副作用完了点について理解しとかないと泣きを見るよ。
627 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:48:35 ] またそうやって「何かをわかってるフリ」したデタラメを書くw
628 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:51:43 ] >>625 ↓にはそういったコードは未定義だと書いてあるが・・・ www.kouno.jp/home/c_faq/c3.html#2
629 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:59:34 ] ANSI-C89より前では「不定動作」だったがANSI-C89からは「未定義動作」 に改められたね。
630 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 13:17:57 ] >>624 おぉ!すごい!できました!革命的! が、これは安全なんでしょうか。^^; VC++2008では allocator::allocate, allocator::construct は const オブジェクトを引数に取れますが allocator::deallocate. allocator::destroy は const オブジェクトを引数に取れません。 つまり、例えば const string 型のオブジェクトのためのメモリ領域は確保できますが、 その領域を開放する術はありません。そこで、 // T は const string 型とする。 // T* p; // allocator< T > alloc; typedef typename remove_const< T >::type * not_constT; // T 型からコンストはずし alloc.destroy( const_cast< not_constT >( p ) ); // p からコンストはずし のようなコードを書いたわけですが、これが正常なのかどうか…。 コンパイルは通っており、テストもパスしていますが、メモリの中身を覗く術がわからないので もしかしたらメモリリークでもしてるのでは、と。
631 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:29:18 ] スレッド、セマフォ、ミューテックス辺りを次の業務でするんだけど プロセスとスレッドの違いが良くわかりませぬ。 スレッドってなんだ?
632 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:42:34 ] ここのこと それはスレッド
633 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:44:55 ] >>632 それだけは言って欲しくなかった…
634 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:54:21 ] プロセス・・・プロセスごとにメモリ空間(=グローバル変数とかヒープとか)が別々 スレッド・・・全部のスレッドでひとつのメモリ空間を共有 メモリ空間を共有するので複数のスレッドからひとつの変数を 同時に書き換えたりとかわけわからんことにならぬよう注意せよ セマフォとかは普通にプロセス間でも使えるんじゃ?
635 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:15:19 ] >>634 ありがとう 確かに共有メモリがどうの聞いた!
636 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:17:08 ] 「業務」で未知状態でマルチスレッドか…… ご愁傷様って奴だな
637 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:25:13 ] 共有メモリとメモリ空間共有とは違うw
638 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:36:17 ] えらんツッコミのせいでせっかくの感動が台無しだ
639 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:40:48 ] 地獄への第一歩で感動とかされても
640 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:50:50 ] Windows3.xやWin32sのプロセスはスレッドだったのか
641 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:06:45 ] 地獄とかやめて 確かに既に炎上してるらしいが
642 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:16:21 ] 既に炎上してるところに知識のない奴が投入されるのか・・・ ご愁傷様という他ないな
643 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:16:35 ] passive hell and death
644 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:19:33 ] デスマーチのプロジェクトは働かなくても給料もらえるからいいじゃない。 だって、どうせ出来上がらないんだから!
645 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:22:18 ] const char *hoge[5]={"test","test2","test3","test4","test5"}; というのを宣言します。 char *hoge2; hoge2 = hoge[3]; という代入をしたいんですが、コンパイルが通りません。hogeのほうにconstをつけなければいけるんですが・・・ 教えてください
646 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:26:08 ] >>645 そういうのを通さないためのconstです。 明示なcastをしてください。
647 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:28:11 ] >コンパイルが通りません エラーになった原因とかコードとかでてるだろ? それを調べてみればここで聞くまでもなく答えはすぐわかるよ。
648 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:28:42 ] 代入される変数がconstついてなければできるのだと思ってました hoge2 =(char)hoge[3];ですか?
649 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:29:53 ] hoge2にconst
650 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:31:25 ] char * だろ。 constのポインタをconstでないポインタに代入しようとしてるから。
651 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:32:21 ] 程よいレベルだとやっぱ群がるなぁ
652 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:35:24 ] >>649 hoge2はconstだと困るんです
653 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:38:02 ] char hoge2[5] でstrcpy
654 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:42:35 ] >>652 なんで困るのか言ってみようか
655 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:42:48 ] C++ならSTLのstd::string使うとか
656 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:43:37 ] >>650 それだといけました >>653 それもありなんですね >>654 いろいろ書き換えたいんです
657 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:50:41 ] 文字列定数を書き換えてはいけない 必ずstrcpyでコピーしる
658 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:53:18 ] そもそもなんとなく この宣言を使ってるんですが char *hoge[5]={"test","test2","test3","test4","test5"}; イメージ的にはどんな感じですか hoge[0] 文字列testへのポインタ hoge[1] 文字列test2へのポインタって感じですか?
659 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 18:24:19 ] そんな感じ
660 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:13:21 ] a.hにクラスAを宣言、別ファイルのb.hでクラスAを継承したクラスBを宣言したいんですが、 B宣言部の「class B:public A」の部分に「型名が必要」とエラーが出ます。(当方Borland C++) a.hをインクルードしても「Aの宣言が複数見つかった」と言われたりで、どうしたらいいんでしょうか。
661 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:15:04 ] >>660 class B の定義より前に class A の宣言だけしてみるとか class A;
662 名前:661 mailto:sage [2008/10/03(金) 19:16:28 ] ごめん >>661 は無しで
663 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:26:27 ] 質問です。 他クラスのメンバ変数にアクセスするにあたって privateなメンバにgetterを使ってアクセスするのと publicなメンバを直接参照するのではどちらが速いですか? CHoge hoge; int a = hoge.m_publicHoge; int b = hoge.getHoge(); // CHogeの実装 // const int& getHoge(){ return m_hoge; }; // public: : // int m_publicHoge; // private : // int m_hoge;
664 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:30:51 ] 一応 速度は直接アクセス 安全性はゲッター だろう一般的に 最適化で速度差無い事もあるけど 普通はゲッター使いなさいと教わるはず
665 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:30:52 ] >>660 それだけだとうまくいくはずなのでもうエスパーさんしか アドバイスできないんじゃないかと エラーの出る最小のコードをどうぞ
666 名前:デフォルトの名無しさん [2008/10/03(金) 19:32:06 ] VC++2008のデフォルト状態Releaseでコンパイルしたものを実行し、CPUメーターで見ました。するとコアが満遍なく使われています。 私はマルチスレッドプログラムも何もしていないのに、コンパイラが自動でマルチコアに最適化してくれたということでしょうか?
667 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:35:11 ] ほかのプログラムが満遍なくCPUを使っていただけだろ。
668 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:42:44 ] >>660 インクルードガードでぐぐれ
669 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:52:56 ] >>665 こんな感じです。 ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7751.zip
670 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:54:33 ] >>669 #include "ca.cpp" #include "cb.cpp" これは。。 ヘッダをインクルードするようにして、多重インクルードガードすればいいと思うよ。
671 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:55:40 ] ボーランドのリンカ使い方知らないけど、 それぞれのcppからobj作って、それらをリンクして、exeを作るのが普通。
672 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:57:11 ] >>671 makefileみたらそうなってるから >>670 だけでいいんじゃないかな
673 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 20:22:08 ] >>670 つまり、main.cppでa.hとb.hをインクルードして、 a.cppとb.cppではインクルードガードをかけるだけて、単にメンバ関数を書くだけでいいという事ですか?
674 名前:663 mailto:sage [2008/10/03(金) 20:37:11 ] >>664 サンクスです。 やはり直接アクセスの方が速いですか。。。 参照返ししてるからほぼ同等だと思ったのですが甘かったようですね。 getter使うにしてもローカルで複数回使う場合 func1( hoge.getHoge(; ); func2( hoge.getHoge() ); func3( hoge.getHoge() ); とするより int& b = hoge.getHoge(); func1(b); func2(b); func3(b); のようにした方がオーバーヘッドは減りますよね?
675 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 20:42:29 ] メンバ関数はインライン関数にできてだな
676 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 20:43:35 ] 最適化を前提にするなら余計なことはしないほうがよいだろう。 get/setは*.hにインラインで記述するのが基本。 気になるならアセンブリリストを出力したり、実際に測定するといいよ。
677 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 21:05:57 ] >>674 intなら参照使わない方が早いんじゃね? どういう用途か知らないけど なんにせよ実測するのが一番だな
678 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 21:23:04 ] >>674 値をレジスタに置けるなら、メンバの内容をローカル変数にコピーして、 一通り操作が終わったら、メンバに書き戻す方が良いかも。 メンバへの変更 ( 副作用 ) が発生するポイントが、書き戻し部分に限定 される点もメリット。
679 名前:673 mailto:sage [2008/10/03(金) 21:50:44 ] 解決しました。 どれから読み込んでもいい様、使う関数のあるヘッダはインクルードガード付けた上で 形式上でもインクルードしておけ、って事ですね(多分)。 アドバイスくれた方々、ありがとうございました。
680 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 22:33:10 ] >>679 > a.cppとb.cppではインクルードガードをかける ヘッダ内でガードする。 多重インクルードされた結果、重複定義が発生する。 > ヘッダはインクルードガード付け となっているから理解したのかもしれないけれど。 すっきりさせるために動かない状態が続くよりは、ぐちゃぐちゃでもなんとか動く状態の ほうがいいので、動く状態をキープしたまますっきりさせられるように努力するといいですよ。 リファクタリングって言葉も調べてみてください。
681 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 23:09:43 ] よくwindowsプログラムのサンプルコードでInitAppとInitInstanceってあるけど、どういう分け方してるんですか?
682 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 23:31:17 ] エスパーに失敗した。もうちょっと情報頼む。
683 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 01:04:14 ] >>681 気分
684 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 01:22:24 ] >>681 そういう作りはWin16時代の遺物なので今となっては意味がない Win16ではアプリケーションの最初のインスタンスだけが実行すべき処理を InitApplication()に記述して、 WinMain()の引数hPrevInstanceがNULLの場合にのみInitApplication()を実行していた。