int GetAnswer(LPVOID param)
{
DWORD *p;
・・・
p = (DWORD *)param;
p = 123;
return 0;
}
main・・・
{
char ansstr[100];
DWORD ans;
GetAnswer(&ans);
sprintf(ansstr, "答えは%dです", ans)
MessageBox(NULL, ansstr, "回答", MB_OK);
}
これを
char ansstr[100];int GetAnswer(LPVOID param)
{
・・・
(キャスト)param = 123;
return 0;
}
のようにDWORD *p;とか使わないでできないでしょうか?
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
すでに回答にあるとおり、可能です。
# GetAsnwer() にある 「p = 123;」の部分は「*p = 123;」の間違いである
# とう前提で話を進めます。
# 間違いでなければ、jacta さんのおっしゃるように、何をやりたいのか
# よく分からなくなってしまいますし。。。
int GetAnswer( LPVOID param )
{
……
*(DWORD *)param = 123;
return 0;
}
といった感じですね。
ただし「可能」というだけで、あまりお勧めしません。
引数の void ポインタ経由でわたってきたデータが何であるかが不明になるだけでなく、この変数を参照するたびにキャストしなければならず、非常に面倒くさいです。
# 面倒くさい=ミスしやすい、ということですからねぇ。。。
それにキャストはコード全体を見にくくします。
というわけで、ertvak さんが最初に示されている void ポインタ経由でわたってきたデータは、使いたい方の変数に代入しなおして使うことをお勧めします。
int GetAnswer( LPVOID param )
{
DWORD *p;
p = (DWORD *)param;
……
*p = 123;
return 0;
}
「p = 123;」の部分は「*p = 123;」の間違いでした。
No2、No4、の方にもよく理解してもらいました。
実際にはコールバックなのでLPVOIDは変更不可能な状況です。
それに引き換え1,3は,,,
static_castで解決しました。
No.4
- 回答日時:
No.2 です。
int GetAnswer(LPVOID parama);
という形は、コールバック関数か何かで、システム側から、引数の型を含めて、型が決まってしまっている関数なのですよね、きっと。
そして、具体的に使う際には、パラメータにいろいろなデータを使いうるので、LPVOID という汎用ポインタで受けると。
関数側では(どのようなデータが来るのか知っているはずなので)その型にあわせて、処理をするということで。
おそらくは、
int GetAnswer(LPVOID param)
{
DWORD *p;
・・・
p = (DWORD *)param;
// 一次変数にポインタ値を代入して、
*p = 123;
// そのアドレスに対して、結果を代入することで
// 間接的に、param に値を返す
return 0;
}
というのを、*p なしで出来ないかということだと思います。もしも、本当に、p に 123 という数値を(アドレスと見なして)代入するのであれば、
p = (LPVOID)123;
p = reinterpret_cast<void *>(123);
のいずれかになるはずです。
ちなみに、C++ の普通のキャストである、
p = static_cast<void *>(123);
はエラーになります。これは、あまりに危険なキャストであるため、特殊な書式が要求されるわけです。
それに対して、Cのキャストは、何事もなく通してしまいます。
このあたりが、C++では、static_cast<> が推奨される所以でもあります。
No.3
- 回答日時:
#1です。
> よい設計を書いていないのであまりよい回答とはいえません。
何をしたいのかが分からない以上、どうすることもできません。
p = (DWORD *)param;
p = 123;
の部分ですが、*p = 123;ではないので、ポインタ変数に123を代入しているだけで、ポインタの参照先は変更していないわけですよね。これにどんな意味があるのかわかりませんが、単にダミーコードを入れたいのであれば、やはり別の変数を使うしかありません。
もし、どうしても(キャスト)param = 123;という形式で、警告もでないものが欲しいのであれば、C++で、かつLPVOIDとint型のサイズと境界調整が等しい場合に限り、
(int&)param = 123;
とすれば解消すると思います。
paramを破壊したくないのであれば、やはり別の変数を用意するか、あるいは(最適化でなくなる可能性も高いので)何もしないか、どちらかです。
No.2
- 回答日時:
例題となっている関数の動作自体はかなり意味不明ですが……
単に、DWORD *p という一次変数を使いたくないという意味であれば、
*(DWORD *)param = 123;
でOKです。
*static_cast<DOWRD *>(param) = 123;
C++ では、こちらの方が推奨されていますが。
No.1
- 回答日時:
LPVOIDというのはvoid*のことでしょうか?そう解釈して回答します。
単に、ポインタ変数に整数を代入したいだけであれば、キャストなしでもそのまま代入することができます。
int GetAnswer(LPVOID param)
{
・・・
param = 123;
return 0;
}
といった具合です。
コンパイラによっては警告が出るかもしれませんが、できないわけではありません。
ただ、具体的に何をしたいのか分かりませんが、あまりよい設計とはいえません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
セグメントエラー
-
Run-Time Check Failure #3とい...
-
fopne で失敗する原因
-
init関数の意味
-
Vector定義の配列の共有メモリ化
-
C言語でのconstを返す関数
-
デバイスハンドルとは?
-
VC++6.0 MFC ダイアログバーを...
-
ExcelVBAでのkernel32(64bit)
-
CImage GetBitsメソッドについて
-
アプリを32bitから64bit移行
-
TCHAR文字列内の検索について
-
popenした子プロセスのプロセス...
-
x64プログラムでアドレスが32bi...
-
PASCALとFARの意味
-
LPSTR型の初期化について
-
C言語のプログラムをJavaに...
-
c言語で任意のファイルから読み...
-
参照型で受け取った引数をポイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
fopne で失敗する原因
-
戻り値で構造体を返すことは可...
-
LPSTR型の初期化について
-
ExcelVBAでのkernel32(64bit)
-
参照型で受け取った引数をポイ...
-
ハンドル、アドレス、ポインタ...
-
ハンドルはポインタか
-
C言語でのconstを返す関数
-
デバイスハンドルとは?
-
Cで作成したDLL関数をVBから呼...
-
popenした子プロセスのプロセス...
-
c言語で任意のファイルから読み...
-
[excel vba] マウスポインタの...
-
パスからファイル名を抽出
-
プーさんのマウスポインタを教...
-
基本アルゴリズムの『返す』の...
おすすめ情報