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でのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
29 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 14:55:48 ] int func(int a) { if(a>10) a=10; return a+1; } のように引数で渡された変数を変更しても問題ありませんか?
30 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 14:59:21 ] >>29 大丈夫
31 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 20:01:43 ] >>29 大丈夫ではあるけど、 関数内で二度と a の元の値を使えなくなってしまうので注意。 後になって処理を追加した際に、 途中で値が変更されてるのを忘れて処理を追加して 上手く動かねーとかなるといけないから、 なるべくなら別変数を作った方が好ましいし、 それでも a を変更したいんだ!ってんなら、コメントでも残しておくといい。
32 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 20:28:26 ] >>30-31 ありがとうございます
33 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 21:19:28 ] int func(int& a, int* b = &a) { if(a>10) a=10; return *b++; }
34 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 21:44:16 ] int func(const int a){ return (a>10)? 10+1: a+1; } wwww
35 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 23:05:14 ] 急に過疎ってどうしたんだ?
36 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 23:29:01 ] 春だからさ・・・・・
37 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 02:10:04 ] Cとgrassのハイブリッド言語かと思った。
38 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 02:43:26 ] grass と 常用単語の堺は3文字あたりから? void fp(int (*s)[8]); void fr(int& s[8]); any(){ int s[8]; int sx[32][8]; int* sp[8]; int* sxp[32][8]; int o[16]; enum{a...b=32}x; fp(&s); fp(&(sx[x])); fp(sp); fp(*(sxp[x])); fp(&((int*[8])o)); fr(s); fr(sx[x]); fr(*sp); fr(**(sxp[x])); fr(*((int*[8])o)); } どっかに考え方が判り易くまとまった資料ない? 正解不正解はコンパイル通してみるまで判らない自分。
39 名前:デフォルトの名無しさん [2009/02/14(土) 03:23:09 ] windowsアプリケーションなんですが Borland C Compiler 5.5にて MAKELONGマクロが警告にひっかかってしまいます。 windef.hの定義を見るに括弧が足りないのが原因のようです。 これは単純にwindef.hのミスですか?BCCのミスですか?私の設定ミスですか?
40 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 07:52:34 ] >>39 windef.hのミスだね 本家のWinDef.hは括弧が多かった #define MAKELONG(a, b) ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16))
41 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 07:55:25 ] 調べなおしてみたらVC+2008EEに付属のSDKは括弧が多かったが昔のPlatformSDKのは少なかったわ
42 名前:39 mailto:sage [2009/02/14(土) 11:12:03 ] >>40-41 ありがとうございます。 MAKELONGを(あとMAKEWORDも) #undefして括弧増やした#defineしなおしてもいいもんでしょうかね?
43 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 11:43:07 ] >>42 しなおしてもいいし大元のファイルを修正してもいいし警告無視してもいいよ 簡単にすると( A | B << 16 )ってなるから ( B )に括弧が必要というわけか
44 名前:43 mailto:sage [2009/02/14(土) 11:45:56 ] ( B << 16 )に括弧が必要 の間違いでした
45 名前:39 mailto:sage [2009/02/14(土) 12:34:59 ] >>43-44 どうもでした。
46 名前:デフォルトの名無しさん [2009/02/15(日) 08:59:26 ] LPTSTRを使って char hoge[40]; みたいな固定長の、文字を入れておける場所を定義するのって出来ますか?
47 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 09:13:07 ] TCHAR s[40]; がいいかな
48 名前:デフォルトの名無しさん [2009/02/15(日) 09:18:16 ] ありがとうです。 それでできました!
49 名前:デフォルトの名無しさん [2009/02/15(日) 09:24:24 ] もう一個だけ質問させてください。 _T("ddd"); TEXT("ddd"); これって書き方が違うだけで同じですか?
50 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 09:39:22 ] 同じ。 強いて言うなら、前者はCライブラリの拡張で、後者はWin32。 ちなみに前者のバリエーションで_TEXTもある。
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)); }