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でのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
51 名前:デフォルトの名無しさん [2009/02/15(日) 23:26:08 ] ありがとうございます。なるほど。 TCHARとかLPTSTRとかにあわせて、TEXT("")を使います。
52 名前:デフォルトの名無しさん [2009/02/15(日) 23:33:30 ] 背景とカーソルを同時に表示しようと思うんですが、 その画像をまとめてメモリデバイスコンテキストに選択して、 「最終的に表示する画面」を先に作る方法が分からないので、 どなたか教えていただけないでしょうか。 環境は WinAPIです。 よろしくおねがいします
53 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 00:09:31 ] それはカーソルじゃなくてキャレットのことかね?
54 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 00:45:17 ] 関数の引数に関数を渡すことはできませんか? 処理の途中で指定した関数を入れたいんです。
55 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 00:46:34 ] >>54 関数ポインタというのがあってだな
56 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 00:51:08 ] thx出てきました!
57 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 01:02:45 ] // class A void Func(){} X.pfFunc = Func; // class X void (*pfFunc)(); void Shori(void pfFunc()){ (*pfFunc)(); これどうやって引数に渡す時と、使うとき書けばいいですか?
58 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 01:09:27 ] >>53 すいません言い方が悪かったです 画像2枚だと考えてください 背景の画像と 矢印の画像です。 よろしくおねがいします
59 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 01:51:58 ] >>58 WinAPIスレにでもどうぞ。 >>57 メンバ関数は普通の関数ポインタとは振る舞いが異なるので注意。 「メンバ関数のポインタ」とでもして、検索してみることをお勧め。
60 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 03:19:29 ] コンストラクタってパブリックにしないとだめですよね? newするときアクセスできないとか言われるんですが、内部でよんでくれるんじゃなかったんですか?
61 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 03:53:17 ] ポインタは使い終わったらNULLしたほうがいいんですか? NULLしないでポインタを持っていたクラスをdeleteしたらポインタがゴミとして残るんでしょうか? というかそうしたら変数も解放しなきゃいけないのですか?どうやんお?
62 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 04:04:37 ] >>61 NULLするってなんだよ?
63 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 04:08:33 ] >>61 どうやんお? でちょっと笑た ポインタとメモリの動的確保についてもーちょい学ぶべき NULLするってのはNULL入れるってことかい
64 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 04:12:26 ] ポインタはオマエ自身から持つ手綱 データはペットの犬 手綱は他人のペットにも付けられるが そのペットは苦しい。 自分の飼っている犬の手綱はポイチョと捨てると他人に迷惑だが 他人のペットに付けた手綱はポイチョと捨ててもあまり問題にはならない。 他人のペットも譲られて唯一の飼い主がオマエになればオマエに責任が
65 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 04:22:53 ] 難読Cコンテストを思い出した
66 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 04:28:14 ] メンバ関数ポインタは入れる時と使うときクラス名が必要なことがわかりました! これじゃあライブラリとして使えなく無いですか? 設計を見直せですか?
67 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 04:29:23 ] 定数へのポインタは渋谷のハチ公に首輪をつけるようなもの 全くの無意味ではないが楽しく一緒に遊んでくれない。 土佐犬にチワワ用の首輪を付けても首じゃなく足首に掛かったりして土佐犬を転ばせたりする。 だからと言ってロデオロープ的な void * で括ってアチコチ引き回したら犬が昇天する場合もある
68 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 04:37:03 ] やばい 全く集中できなくなった
69 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 05:07:23 ] 関数の中で static int a = 0; とした場合このaは関数を抜けても保持されるんでしょうか? 起動時最初の一回しか変数が存在しないことになるんでしょうか?
70 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 05:38:57 ] >>69 スコープがブロック内に限定されてるだけで、他はグローバル変数と同じと言える だからアドレスを渡して関数外からアクセスしようが問題ない
71 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 06:06:42 ] ありがとうございます!!! >>60 >>61 >>66 もお願いします!
72 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 06:50:02 ] 構造体の配列を引数に渡して使うにはどうすれば書けばいいでしょうか structA a[] = { { 1, 2, }, {3, 4,}, }; //ClassX.h Class* Z; //ClassX.cpp Z = new ClassZ(); Z->func(a); //ClassZ.h void func(structA bufa); //ClassZ.cpp func(structA bufa){ sizeof(bufa); } このときsizeofで帰ってくる値はどういう値ですか?
73 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 06:57:12 ] >>72 structAが何バイトか(C99だとそういいきれないけど別にいいだろう) 配列渡すなら void func(structA bufa[]); //ClassZ.cpp func(structA bufa[]){ sizeof(bufa); } とでもすればいい、ただしこれは void func(structA *bufa); //ClassZ.cpp func(structA *bufa){ sizeof(bufa); } と等価なのでsizeof(bufa)はどちらもポインタのサイズになる(配列のサイズではない)
74 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 07:12:22 ] 構造体の各値がintだとすると { { 1, 2, }, {3, 4,}, } 4個*4バイト=16バイト が返るようにするにはどうすればいいですか? []付けたんですけど funcの中で structA b[]; b = bufa; としたらstructA[]からstructA[]に変換できませんとでるんですがこれはどうなおせばいいでしょうか
75 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 07:24:43 ] structA b[100]; bに代入はできない b[0] = とかはできるけど
76 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 07:27:03 ] >>66 C# の delegate を参考にしてみれ。 class delegate { public: virtual ~delegate() { } virtual void operator()() = 0; }; template <typename T> class delegateT : public delegate { public: typedef void (T::*Mfn)(); delegateT(T* obj, Mfn mfn) : m_obj(obj), m_mfn(mfn) { } virtual void operator()() { (m_obj->*m_mfn)(); } private: T* m_obj; Mfn m_mfn; };
77 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 07:31:00 ] boost::bind.hpp boost::function.hpp を使うとか
78 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 10:57:01 ] >>75 C++でも出来ないとこってあるんですね サイズは送り元で計算して引数は増えますが一緒におくることにしました。 受取側の関数で構造体の配列変数を除くと1つ目の構造体しか表示確認できなかったんですが、 サイズを添え字にして強引?に全配列をプログラム実行の中で処理できました。 が、これ保障されてますか?安心してこういう使い方して大丈夫なんでしょうか?
79 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 12:11:20 ] C#の中のコード全然意味わかりません boost調べたら簡単にできました。 ありがとうです! //classA CC* pC; CB* pB; pB->Func(bind(&CC::Update, ref(pC))); //classB void CB::Func(function<void ()> f_buf) { f_buf(); } // classC void CC::Update(){}
80 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 12:38:17 ] いややっぱりなにも進展してませんでした function<void ()> f_buf が function<int ()> f_buf だったり function<bool ()> f_buf だったりした場合、汎用ライブラリにしたとして、使うたびに修正しないとだめじゃないですか? メンバ関数ポインタと結局同じなことに気づきました・・・
81 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 12:39:55 ] operator()() これはどういう意味なんでしょうか
82 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 12:49:04 ] >>81 関数オブジェクトでぐぐったら使い方含めてわかるかもよ
83 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 13:16:23 ] >>60 こういう風にnewとprivateなコンストラクタを組み合わせる技法は存在する。 class Hoge { public: static Hoge* Craete(int x) {return new Hoge(x);} private: Hoge(int); }
84 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 13:19:07 ] 出来そうな気がしてきました。 実行したい処理を()演算子の中に作ったクラスを型にした変数を引数として渡せば、 クラスの変数(); とすれば処理が実行されるということですね ありがとうございました。
85 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 13:20:31 ] >>80 実は、function<int ()>型やfunction<bool ()>型からfunction<void ()>型へ変換できる。 戻り値を見ないなら全部function<void ()>型にすればいい。
86 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 16:24:20 ] sprintfの逆のことをしたいのですがそういう関数なかったでしょうか? char str[]="年齢は10,性別は男"; 例えば、(str,"年齢は%d,性別は%s",age,sex)の引数が与えられると age=10,sex=男が得られるようにする関数です。 よろしくお願いします。
87 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 16:26:24 ] sscanf のこと?
88 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 16:40:27 ] >>87 それです。^^; あったような気がしていたのですがprintが 入っている名前の関数だと思い込んで探していました。 助かりました。ありがとうございました。
89 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 11:39:57 ] コールバック関数が今だに理解できないです。教えてください。
90 名前:43 mailto:sage [2009/02/18(水) 11:43:30 ] >>89 関数ポインタはわかるか
91 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 12:00:21 ] わかります。 void Func(){} void * f = Func; (*f)();
92 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 12:03:45 ] オブジェクトを作成するアプリケーションのインスタンスハンドルが必要だとヘルプに書いてあるんですが この場合thisを入れればいいんですか?
93 名前:43 mailto:sage [2009/02/18(水) 12:22:54 ] >>91 コールバック関数のポインタを引数にして渡す #include <stdio.h> /* callback用関数 1*/ int add(int a, int b) { return a+b; } /* callback用関数 2*/ int sub(int a, int b) { return a-b; } void func(int (*callback)(int, int)) { int x = callback(1, 2); printf("%d\n", x); } int main(void) { /* "addへコールバックしてね" */ func(add); /* "subへコールバックしてね" */ func(sub); return 0; }
94 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 12:26:57 ] >>92 状況によるだろう。 でもハンドルと書いてあるからthisはないと思うよ。 なんとなく、hInstanceいれるとこみたいだが。
95 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 12:38:56 ] >>93 ありがとうです! その場合CALLBACKがつくのはどれなんでしょうか メンバ関数もコールバックとして渡せるんですか?
96 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 12:41:45 ] Win32アプリの LRESULT CALLBACK WndProc はまた別物ですか?
97 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 14:22:14 ] WaitForSingleObjectは普通マルチスレッドで使うんですよね? 勝手に別スレッドで待機して制御は返す仕組みじゃないですよね?
98 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 14:25:43 ] まあそうだが、シングルスレッドでもオブジェクトがシグナル状態か確認する時も使う。
99 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 14:43:22 ] >>96 CALLBACKがどう#defineされてるか見てみるといい
100 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 14:49:12 ] gdb 用のGUI ツールお勧め教えて class 関連 CUI じゃツライす
101 名前:43 mailto:sage [2009/02/18(水) 16:26:59 ] >>95 コールバックをする関数の引数に定義された型と同じ関数(戻り値の型と引数の数、型が同じ関数)を作ってその関数名を渡せばいいんだよ メンバ関数は呼び出し規約(CALLBACK = stdcall)が違う(thiscall)かもしれない
102 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 17:09:50 ] >>96 そのコールバックは、引数の処理をどうするか、という指標なんであまり気にしなくて良いと思う
103 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 20:51:27 ] struct V4 { union { struct { float x, y, z, w; }; float m[4]; }; }; と書いた時、 xのアドレス == &m[0] 、yのアドレス == &m[1]、 … になったのですが、これはどんなコンパイラでやっても同じ様になるんでしょうか?
104 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 21:43:59 ] xのアドレス == &m[0]だけは保証されてる あとはコンパイラ次第
105 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 21:45:58 ] >>96 LRESULTは戻り値の型、>>91 でのvoid、 WndProcは関数名、>>91 でのFuncにあたる。 CALLBACKは他の人の言うとおり。
106 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 21:46:44 ] キーボード押しっぱなし時のWM_KEYDOWNは、一回発行された後に 少し時間を置いてから連続で発行されるんですか? キーボードからの入力でキャラクタを動かしているのですが、 キーボードおしっぱ→キャラクタが1ループ分動く→コンマ数秒無反応 →キャラクタが連続で動く、となってしまいます。 ゲームのキャラクタみたいにキーボードを押すとすぐに連続で動作してくれる 処理をしたいのですが・・
107 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 21:53:06 ] >>106 GetAsyncKeyState
108 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 22:08:17 ] >>107 こんな便利なものが・・・ ありがとうございます。
109 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 04:45:06 ] マルチスレッドの関数はグローバル領域に作ったほうがいいですか? クラスの中に入れるとめたくそ難しいんですが
110 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 05:12:32 ] 難しいと思うのならクラス内に作らなくても構いません。
111 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 05:24:48 ] なんでメンバ関数だとコンパイルできないんですか? 静的関数ならいんでしょうか
112 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 05:34:41 ] そりゃぁ、スレッド生成するAPIがクラスに対応してなければインスタンスへのポインタ(this)を渡せませんから。 thisを伴わない静的メンバ関数ならAPIから呼べますから、コンパイルもできるはずです。 まぁ、環境も書かなきゃエラーメッセージも書かないということは、詳しい説明は要らないのでしょうし、この辺で。
113 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 05:55:23 ] いやいります。見捨てないでください AfxBeginThread(CView::Proc, this); //h static UINT __cdecl Proc( LPVOID pParam ); static UINT __cdecl ProcAfter( LPVOID pParam ); //cpp UINT CView::Proc( LPVOID pParam ) { CView *const this_ptr = (CView *)pParam; return this_ptr->ProcAfter(); } UINT CView::ProcAfter( LPVOID pParam ) { //実際にマルチスレッドで実行したい処理 } なぜこう書かないといけないのかが理解できません。直接 AfxBeginThread(CView::ProcAfter, this); こうしたいんですが、エラー出まくります。&CView::ProcAfterにしろとか、やっても仮想関数だとかになるんです。 Afxじゃくても_beginthreadexでも同じなんです。マルチスレッドをクラスのメンバでやるのはそうとう強引で特殊ですか?
114 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 06:19:42 ] >>113 にほんごよめますか? >112 >まぁ、環境も書かなきゃエラーメッセージも書かないということは
115 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 13:37:43 ] Win32アプリのメッセージループ内で独自の処理をする時クラスのインスタンスとかを作るのはどこがいいんですか? ループに入る直前でいいんですか?いろいろなところにここにコードを追加してくださいとか書いてあるので不明です
116 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 13:42:45 ] #define _T("test.txt") fileName マクロの仮パラメータリスト内に予期せぬ文字列がありますのエラーが出ます。 どう書けばいいんですか?
117 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 13:56:14 ] あきらかに変だがどう使いたいわけ?
118 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 14:19:28 ] 文字を置き換えたいだけです。 プログラム中のどこだかわからなくなるので 先頭に置いてファイル名を変えられるようにしたいんです
119 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 14:38:07 ] だったら逆だろ? #define filename _T("test.txt")
120 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 14:56:56 ] 逆でしたか!どうもです
121 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 17:46:10 ] >>113 (非静的な)メンバ関数は普通の関数と違い、&演算子を使わないとメンバ関数へのポインタを得られない という点はエラーメッセージの言うとおり。 そうやってメンバ関数へのポインタを得たところで、>>113 のようにできないわけは、 メンバ関数へのポインタは、普通の関数へのポインタとは中身が異なっているため。 その主な理由は、仮想関数にもきちんと対応しないといけないことから。 メンバ関数を直接渡せるようにしたければ、自分でそういう関数を作ればいいじゃない。
122 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 17:47:35 ] というわけでやってみた。普通は関数オブジェクトを引数にすべきだろうけど。改行制限厳しい。VC++ 2008。SP1ならもう少し簡単になる。 #include <utility> #include <memory> #include <stdio.h> #include <process.h> #include <windows.h> #include <atlbase.h> class Hoge {public: UINT Proc() {puts("Hoge::Proc"); return 0;}}; template<typename T> UINT __stdcall beginthread2_entry(void* p) { typedef std::pair<T*, UINT (T::*)()> thread_data_t; thread_data_t* ptd = static_cast<thread_data_t*>(p); T* px = ptd->first; mem_fn_t mf = ptd->second; delete ptd; return (px->*mf)(); } template<typename T> HANDLE beginthread2(T& x, UINT (T::*memFn)(), int priority = THREAD_PRIORITY_NORMAL, UINT stack = 0, DWORD flags = 0, LPSECURITY_ATTRIBUTES lpsa = 0) { typedef std::pair<T*, UINT (T::*)()> thread_data_t; std::auto_ptr<thread_data_t> ptd(new thread_data_t(&x, memFn)); uintptr_t ret = _beginthreadex(lpsa, stack, beginthread2_entry<T>, ptd.get(), flags, 0); if (ret != 0) ptd.release(); return reinterpret_cast<HANDLE>(ret); } int main() { Hoge hoge; ATL::CHandle h(beginthread2(hoge, &Hoge::Proc)); if (h != 0) WaitForSingleObject(h, INFINITE); }
123 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 18:10:21 ] AfxBeginThread(boost::bind(&CView::ProcAfter, boost::ref(CView), this); これでよくね?
124 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 18:50:29 ] LPSTRからLPCWSTRに変換するにはどうすればいいでしょうか
125 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 19:50:16 ] >>124 Visual StudioのStandard以上を持っているなら、ATLのCA2Wがお勧め。 無いなら、MultiByteToWideChar使え。
126 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 19:50:41 ] >>123 AfxBeginThreadって関数オブジェクト引数に取れるのか?
127 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 10:01:57 ] >>122 難しすぎて誰もわからないに一票
128 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 10:33:23 ] だいたい なんでメンバ関数に固執するんだろう? インスタンスをスレッド間で共有する前提でアレコレ クラスカキコしてたら気が狂うんじゃね?
129 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 14:14:09 ] 以下のソースで、読み込んだデータの改行コードが削除されてしまう。 istream_iteratorを使ってるせい? 環境はmingw(gcc 4.3.3) ifstream fin("data.bin", ios::in | ios::binary); if (fin.good()) { typedef vector<char> Data; istream_iterator<char> begin(fin), end; shared_ptr<Data> data(new Data(begin, end)); }
130 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 14:15:53 ] >>129 istreambuf_iterator
131 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 14:19:08 ] >>130 それだ!どうもありがとう。ペコリ。
132 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 09:23:53 ] !って人が使ってるの見てはじめて気づいた すごいいらいらする
133 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 11:02:58 ] !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!! !!!!!!! !!!!!!!!!!!!!!!! !!!!!!! !!!!!!!! !!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!! ! !!!!!! !!!!!!!! ! !!!!!! !!!!!! !!! !!!! !!!!!!!!!!!!!!! !!!!!!! !!!! !!!!!!!!!!!!!!! !!!!!!!! !!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! しますか?
134 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 11:44:57 ] VS2005 C++でWindows Mobileの開発してます(CはDOS以来の初心者です)。 頻繁に呼ばれる文字列処理をする関数内の最初のオート変数として void hoge(void){ TCHAR szReadBuf[2048]; の様な宣言をしているのですが、この処理を呼んでるループ処理辺りで [Stack fault] Thread= といった様なエラーがでるので void hoge(void){ static TCHAR szReadBuf[2048]; ZeroMemory(szReadBuf, sizeof(szReadBuf)); の様に解放されない処理にした所、最初のコード時より幾分か多く回せるようになりました。 そうゆうもんでしょうか?
135 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 11:54:54 ] >>134 スタック領域は特にモバイルなら大きく取られていないことが多いので、 2048要素の配列で溢れてしまったのでしょう。 後者なら、スタックは消費しないのでその点は大丈夫です。 それはいいとして、ZeroMemory()を呼ぶのが妥当かどうかは検討に値しますが。 # 何故自動変数の時には呼ばないのに静的にしたら呼ぶのか。
136 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 12:36:50 ] 早速ありがとう御座います。 前者はその下でこのようにしてます。 szReadBuf[0]='\0'; 後者でもこうすべきですね? 内部の処理が_tcstok等を使って文字列の置換をする処理なので、前回内容が 残ってると紛らわしいのでZeroMemoryしてました。 あと、GlobalAllocでアロケートした変数の再初期化時にZeroMemoryで初期化してますが ZeroMemoryで無いほうがいいのでしょうか?
137 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 12:45:23 ] 連投すいません 訂正) × 前回内容が残ってると紛らわしいのでZeroMemoryしてました。 ○ デバッグ時に前回内容が残ってると紛らわしいのでZeroMemoryしてました。
138 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 13:16:23 ] BC++です。 クラスを定義したヘッダファイルとそのメンバ関数を定義したcppファイルを コンパイルするとUnresolved external '_main'となってしまいます。 一つにまとめて書くしかないのでしょうか?
139 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 14:01:03 ] 「EXE 作る気はないぜオプション」をBCCに渡す。
140 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 14:57:58 ] -cを付けたらいきました。 ありがとうございます。
141 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 15:50:40 ] >>136 初期化したくて、可搬性を気にしないなら、ZeroMemory()で医院で内科医?
142 名前:134 mailto:sage [2009/02/21(土) 16:06:00 ] >>135 >>141 ありがとうございます。 とりあえず、今のレベルはエラー無く動かす事が目標なので、余裕がでたら考えたいと思います。
143 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 16:06:40 ] memsetだとなんでダメなの?
144 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 16:16:15 ] C++厨はmemset大嫌いだから Cプログラマはmemsetが使える場面をいつも血眼で探してるから C++作法に改宗する時に一番拒むのがここだよな
145 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 16:27:38 ] memsetいいじゃん 初期化楽だし 俺、C++使っててもメンバを構造体にしてmemsetでやっちゃってるし
146 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 16:35:24 ] C++厨は全部のメンバを代入文で初期化してんの?
147 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 16:36:31 ] あ、馬鹿が居る。
148 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 16:36:42 ] メンバ初期化子に決まってるだろ
149 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 16:49:31 ] C厨はポインタもmemsetで初期化してんのか?
150 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 16:51:45 ] >>122 大先生、なんか凄いことしてるみたいだから、一部修正してVC2005でコンパイルしてみたけど、 できないよYo。どうすれば良い? #include <utility> #include <memory> #include <stdio.h> #include <process.h> #include <windows.h> #include <functional> #include <atlbase.h> class Hoge {public: UINT Proc() {puts("Hoge::Proc"); return 0;}}; template<typename T> UINT __stdcall beginthread2_entry(void* p) { typedef std::pair<T*, UINT (T::*)()> thread_data_t; thread_data_t* ptd = static_cast<thread_data_t*>(p); T* px = ptd->first; std::mem_fun_t<UINT, T> mf(ptd->second); delete ptd; return (px->*mf)(); // <======C2297: '->*' : 無効です。右オペランドには型 'std::mem_fun_t<_Result,_Ty>' が指定されています。 } // To be continued
151 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 16:52:10 ] template<typename T> HANDLE beginthread2(T& x, UINT (T::*memFn)(), int priority = THREAD_PRIORITY_NORMAL, UINT stack = 0, DWORD flags = 0, LPSECURITY_ATTRIBUTES lpsa = 0) { typedef std::pair<T*, UINT (T::*)()> thread_data_t; std::auto_ptr<thread_data_t> ptd(new thread_data_t(&x, memFn)); uintptr_t ret = _beginthreadex(lpsa, stack, beginthread2_entry<T>, ptd.get(), flags, 0); if (ret != 0) ptd.release(); return reinterpret_cast<HANDLE>(ret); } int main() { Hoge hoge; ATL::CHandle h(beginthread2(hoge, &Hoge::Proc)); if (h != 0) WaitForSingleObject(h, INFINITE); }