アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記は問題ないことが分かっています。
int i;
MYFUNC(&i);

下記は、=NULLの初期化が必用だと分かっています。
char *p=NULL;
MYFUNC(&p);

下記の場合、=NULLの初期化は必要ないですか?
HWND hWnd;
HPEN hPen;
HDC hDc;
MYFUNC(&hWnd, &hPen, &hDc);

A 回答 (3件)

まず、質問タイトルと質問文の関連が良くわかりません。


その前提で、タイトルと本文の質問内容を切り分けて考えます。

[ハンドルはポインタか?]
本文に「WHND」とあるのでWindowsAPIの話であることはわかりますが、「ハンドルの概念」はC/C++の概念ではなく環境依存(主にOSに密着)なのでWindowsの話であることを明言したほうが良いでしょう。

さてハンドルですが、「メモリ断片化を防ぐために移動可能な動的メモリブロックを管理する値」という意味のハンドルはMacitoshが発祥です。
MacintoshOSにおけるハンドルは「メモリブロックを指し示すポインタ(=マスタポインタ)へのポインタ」という単純な概念でした。
このハンドルの概念をWindowsOSが取り入れたときに(あまりにへたくそなインプリメントであったために)混乱の要因を作ったのです。

WindowsOSにおけるハンドルは「動的メモリブロックを管理する値」そのものであり、「実際にメモリブロックをアクセスするためにはポインタへの変換が必要」という仕様です。
つまり、「ポインタ」であるか「ポインタ以外の値」であるかはは知る必要はありません。
「ポインタで無い可能性が有る」と考えるべきです。

仮に現在のWindowsOS上で「ハンドル=ポインタ」が成立しているとしても将来的にどうなるかはわかりません。
「ソフトウェアの寿命はプログラマの予想よりも長い」という法則を信じるなら「より安全性の高い方法/概念」を優先するべきです。

[質問文本文について]
HWND hWnd;
HPEN hPen;
HDC hDc;
MYFUNC(&hWnd, &hPen, &hDc);
初期化が必要であるか無いかはMYFUNCの仕様です。
MYFUNCの冒頭でNULL初期化するならMYFUNCの呼び出し側では初期化の必要はありません。

MYFUNC内の処理が「初期化を必要と無い処理」であれば、初期化自体を必要としません。

MYFUNCの仕様の説明なしにこの質問に答えられる人はいないでしょう。

この回答への補足

まず、質問タイトルと質問文の関連が良くわかりらない人にはいちいち説明する気はありません。
その前提で、このスレが、「あまりにへたくそなインプリメント」とかいう質問と関係ない個人的な意見の主張の踏み台として使われたことに突っ込んでおきます。
「MYFUNCの仕様の説明なしにこの質問に答えられる人はいない」と思う人はあんただけでしょう。

補足日時:2003/02/02 17:53
    • good
    • 0

>int i;


>MYFUNC(&i);
これは、アドレスを渡しています。MYFUNCの中でiをアクセスするときの
記述です。

>下記は、=NULLの初期化が必用だと分かっています。
>char *p=NULL;
>MYFUNC(&p);

MYFUNCへポインタのポインタを渡したいのでしょうか?
ポインタをNULLで初期化するとMYFUNCの中でpに値をセット
すると0番地にアクセスすることになります


>下記の場合、=NULLの初期化は必要ないですか?
>HWND hWnd;
>HPEN hPen;
>HDC hDc;
>MYFUNC(&hWnd, &hPen, &hDc);

これはポインタではなく構造体です。
MYFUNCへは構造体のポインタを渡すことになります。
初期化する必要があるとすれば、それぞれの構造体のメンバで
MYFUNCで設定する項目を異常時の値にしておけばいいと思います。
初期化が必ずしもNULLとは、限りません。

この回答への補足

MYFUNC(&p);はMYFUNC(p)でした。
ありがとうございます。
次の、構造体というのが分かりませんでした。
それはyoyoyonoyoさんの間違いですよね?

補足日時:2003/01/30 13:04
    • good
    • 0

ハンドルは、VisualC++等のWIN API関数の復帰情報が入ったり、もしくはそのハンドルで取られる情報(例えば、CreateFileだったら、ファイルポインタ等の一意の情報が普通取られます。



ポインタというわけでは、ないですが、初期化しないと中には不定な値が入っているので、予め正常な復帰値というのが判っていれば必要はないでしょうが、
普通一般的には、異常復帰値で初期化しておくのがポピュラーのようです。

この回答への補足

不定な値が入っていればアドレスが確定しているから
=NULLの初期化は不用なんですが、
char *p;では、そのまま&pのアドレスに値を入れる関数に
使ったりすると、アドレスが確定していないからエラーになりますよね。
HWNDのようなハンドルは、HWND hWnd;でhWndのアドレスは確定すると
保証されているんでしょうか?

補足日時:2003/01/30 14:51
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A