
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.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の仕様の説明なしにこの質問に答えられる人はいない」と思う人はあんただけでしょう。
No.2
- 回答日時:
>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さんの間違いですよね?

No.1
- 回答日時:
ハンドルは、VisualC++等のWIN API関数の復帰情報が入ったり、もしくはそのハンドルで取られる情報(例えば、CreateFileだったら、ファイルポインタ等の一意の情報が普通取られます。
)ポインタというわけでは、ないですが、初期化しないと中には不定な値が入っているので、予め正常な復帰値というのが判っていれば必要はないでしょうが、
普通一般的には、異常復帰値で初期化しておくのがポピュラーのようです。
この回答への補足
不定な値が入っていればアドレスが確定しているから
=NULLの初期化は不用なんですが、
char *p;では、そのまま&pのアドレスに値を入れる関数に
使ったりすると、アドレスが確定していないからエラーになりますよね。
HWNDのようなハンドルは、HWND hWnd;でhWndのアドレスは確定すると
保証されているんでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- 工学 Pythonのvectorizeに関連した質問です。 4 2022/12/16 18:01
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
このQ&Aを見た人はこんなQ&Aも見ています
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
(マルチスレッド)_beginthreadexに複数の引数を渡す
C言語・C++・C#
-
バッファとは何ですか
C言語・C++・C#
-
-
4
ハンドル、アドレス、ポインターについて。
Visual Basic(VBA)
-
5
CString から LPCTSTRの型に変換
C言語・C++・C#
-
6
スレッドの終了の仕方
C言語・C++・C#
-
7
Winsockで接続待ちタイムアウトを設定する方法
C言語・C++・C#
-
8
WaitForSingleObjectの使い方について
C言語・C++・C#
-
9
テキストボックスからフォーカス外す
C言語・C++・C#
-
10
charからLPTSTRへの変換方法
C言語・C++・C#
-
11
CStringの文字列検索&抜き出しについて
C言語・C++・C#
-
12
画面を強制的に再描画させる方法
C言語・C++・C#
-
13
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
14
CStringをwchar_tに変換したい
C言語・C++・C#
-
15
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
16
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
17
スレッドの安全な終了のさせ方
C言語・C++・C#
-
18
ダイアログボックスで指定したサイズどおり表示されない
C言語・C++・C#
-
19
VC++スレッドの正しい終了のさせかた
C言語・C++・C#
-
20
ネットワーク切断を検出するには?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
戻り値で構造体を返すことは可...
-
Run-Time Check Failure #3とい...
-
PASCALとFARの意味
-
セグメントエラー
-
init関数の意味
-
CWnd::EnableWindow()の扱い方
-
C言語、配列とポインタとアスタ...
-
Cで作成したDLL関数をVBから呼...
-
ハンドルはポインタか
-
構造体を値で渡す良い点はあり...
-
C言語のポインタに直接アドレス...
-
#define NULL ((void *)0) の弊害
-
1mWの緑レーザポインタで紙は、...
-
プログラミングのfarについて
-
クラスの参照渡しとメンバ変数...
-
Segment情報の取得と設定
-
構造体の削除について
-
FT_Memoryというオブジェクトは...
-
関数内、ファイルのstatic変数
-
どうしてエラーになるかわかり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
戻り値で構造体を返すことは可...
-
LPSTR型の初期化について
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
参照型で受け取った引数をポイ...
-
init関数の意味
-
セグメントエラー
-
アプリを32bitから64bit移行
-
ハンドルはポインタか
-
ハンドル、アドレス、ポインタ...
-
C言語でのconstを返す関数
-
C++で関数ポインタから関数名を...
-
パスからファイル名を抽出
-
ReadFileの読み込みエラーについて
-
#define NULL ((void *)0) の弊害
-
CImage GetBitsメソッドについて
-
ポインタ変数の疑問
-
Cで作成したDLL関数をVBから呼...
おすすめ情報