07/09/03 23:05:49
C++3rd 15.5「メンバポインタ」の項を読むといい。
「メンバポインタは、変数ポインタや関数ポインタとは異なり、メモリの位置を指すポインタではない。
メンバポインタは、ポインタというよりも構造体オフセット、配列の添え字に近い。」
14:デフォルトの名無しさん
07/09/03 23:22:19
メンバ関数へのポインタは、
非仮想関数の場合アドレスを、
仮想関数の場合vtblのオフセットを保持するようになっている。
もちろんどっちを保持しているかのフラグも要るし、
多重継承などで複数のvtblがある場合も考えなければいけないし、
そうしてぶくぶくふくれていく。
15:デフォルトの名無しさん
07/09/03 23:22:59
14はもちろん例えばの話ね。
16:デフォルトの名無しさん
07/09/04 03:07:04
>>13のは、主にメンバ変数へのポインタの話。
>>9のは、独自拡張のいわゆる__closureの影響。
17:デフォルトの名無しさん
07/09/04 10:28:56
WinAPIの話なんですが、C/C++の型についてなので、ここで質問させてもらいます。
LPARAMの値lpを
SetWindowLongPtr(wnd, DWLP_USER, lp);
として設定すると、「LPARAMからLONGへの変換。データが失われる可能性がある」と出てきます。
LPARAMもLONGも、元をたどれば同じlongなので、データが変わることはないと思ったんですが…
また、hoge *h; ていうクラスのポインタがあって、
h = reinterpret_cast<hoge *>(GetWindowLongPtr(wnd, DWLP_USER));
とすると、「LONGからより大きいサイズの hoge * へ変換します」と出てきます。
↑2つとも、自分の環境だと自分の期待通り動いてるんですが、
64ビット環境とか、他の環境だと動かない可能性があると言うことでしょうか。
# そもそも、SetWindowLongPtrの第3引数や、GetWindowLongPtrの戻り値の型はLONG_PTRだと、
MSDNライブラリに書いてあるんですが、なぜLONGなのだろう…
18:デフォルトの名無しさん
07/09/04 10:47:52
>>17
URLリンク(msdn2.microsoft.com)
19:デフォルトの名無しさん
07/09/04 10:52:00
>>17
>64ビット環境とか、他の環境だと動かない可能性があると言うことでしょうか。
そのとおり。
ただし、32ビットOSでは現在でもSetWindowLongPtrはSetWindowLongの別名として
マクロ定義されているだけなので、MSDNでは第3パラメタがLONG_PTRになっているが、
ヘッダの宣言ではSetWindowLongと同じLONGのままの扱い。
そのために警告として表示されると思われる。
>なぜLONGなのだろう…
WindowsAPIは当初から64ビット対応されてたわけではない。
以前はポインタやハンドルをLONGやDWORDで扱っている箇所があった。
64ビット対応したとき、単純にいままでLONGだった箇所はLONG_PTRに、
DWORDだった箇所はDWORD_PTRに変更したと思われ。
20:デフォルトの名無しさん
07/09/04 10:57:10
あ、そのとおりってことはないな。
19に書いたとおり、32ビットOSでの警告は現在の実装(ヘッダ)の問題と
思われるので、その警告は無視してよい、かな。
21:デフォルトの名無しさん
07/09/04 22:10:11
boost::function<bool (int, int)>;
このテンプレート部分はどうやって取得すればいいんでしょうか。
ああああああああああああああああああああああああ
22:デフォルトの名無しさん
07/09/04 22:13:18
テンプレート 引数
ひきすう いんすう
hikisuu innsuu
hikky
23:デフォルトの名無しさん
07/09/04 22:21:34
>>21
template<class T>
void func(boost::function<T> &f) { ... }
じゃダメなん?
24:デフォルトの名無しさん
07/09/04 22:32:31
type1 (type2, type3, type4 .......)
からどうやって、 type1 type2 type3 type4 をそれぞれ得るか?
25:デフォルトの名無しさん
07/09/04 23:28:43
「sizeof演算子は、size_t型の整数値を返す」と習いましたが、size_t型はC/C++の予約語ではなく、
どこかのヘッダファイル(VC2005だとcrtdefs.hにありました)にtypedefされている型だと思うんですが…。
でも「何も」includeしなくてもsizeof演算子は使える…。
というかsize_tも使える…。なんでsize_tが定義されてないのに使えるのでしょうか。コンパイラマジック?
こんなこと気にしてたら禿げますかね
26:デフォルトの名無しさん
07/09/04 23:30:37
コンパイラマジックです。
27:デフォルトの名無しさん
07/09/04 23:33:28
>>25
sizeofは、コンパイラがsize_tのtypedef元として
使うであろう整数型を結果とするということ。
コンパイラとライブラリは、全くの別物が
無関係に作るということが(おそらく)ないので、
これでうまくいくはず。
28:デフォルトの名無しさん
07/09/04 23:34:35
定義されていなければ使えない
使える→どこかで定義されている
探せ
29:デフォルトの名無しさん
07/09/05 00:25:42
すみません
C言語でSocketを用いて通信する場合は
サーバー・クライアント両方とも
C言語で設計されていなくとも通信できるのですか?
30:デフォルトの名無しさん
07/09/05 00:29:58
>>29
出来る。
あたりまえだろ。
31:デフォルトの名無しさん
07/09/05 00:32:02
>>29
まったく問題ない
極端にいえば、アセンブラでソケットライブラリ叩いても結構
一見ばかばかしいとも思えるけど、FAQらしいのでマジレス
32:デフォルトの名無しさん
07/09/05 00:37:38
せっかくなので、前見たなーってのを探してきた
たぶん、こういうニュアンスもあるんじゃないかと思う
2.5 - Can I use Winsock with { My Favorite Language }?
URLリンク(tangentsoft.net)
33:デフォルトの名無しさん
07/09/05 01:03:39
Cで16進数の FFC8D6 という値があったとして
それぞれ FF と C8 と D6 を取り出したいんですが
どうすればいいんですか?
何となくシフトすれば良いって気もしないでもないんですが・・・