許せない心理テスト

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件)

すでに回答にあるとおり、可能です。



# 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;
}
    • good
    • 0
この回答へのお礼

「p = 123;」の部分は「*p = 123;」の間違いでした。
No2、No4、の方にもよく理解してもらいました。
実際にはコールバックなのでLPVOIDは変更不可能な状況です。
それに引き換え1,3は,,,
static_castで解決しました。

お礼日時:2005/09/13 01:41

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<> が推奨される所以でもあります。
    • good
    • 0

#1です。



> よい設計を書いていないのであまりよい回答とはいえません。

何をしたいのかが分からない以上、どうすることもできません。

 p = (DWORD *)param;
 p = 123;

の部分ですが、*p = 123;ではないので、ポインタ変数に123を代入しているだけで、ポインタの参照先は変更していないわけですよね。これにどんな意味があるのかわかりませんが、単にダミーコードを入れたいのであれば、やはり別の変数を使うしかありません。

もし、どうしても(キャスト)param = 123;という形式で、警告もでないものが欲しいのであれば、C++で、かつLPVOIDとint型のサイズと境界調整が等しい場合に限り、

(int&)param = 123;

とすれば解消すると思います。
paramを破壊したくないのであれば、やはり別の変数を用意するか、あるいは(最適化でなくなる可能性も高いので)何もしないか、どちらかです。
    • good
    • 0

例題となっている関数の動作自体はかなり意味不明ですが……



単に、DWORD *p という一次変数を使いたくないという意味であれば、

*(DWORD *)param = 123;

でOKです。
*static_cast<DOWRD *>(param) = 123;
C++ では、こちらの方が推奨されていますが。
    • good
    • 0

LPVOIDというのはvoid*のことでしょうか?そう解釈して回答します。



単に、ポインタ変数に整数を代入したいだけであれば、キャストなしでもそのまま代入することができます。

int GetAnswer(LPVOID param)
{
 ・・・
 param = 123;
 return 0;
}

といった具合です。
コンパイラによっては警告が出るかもしれませんが、できないわけではありません。

ただ、具体的に何をしたいのか分かりませんが、あまりよい設計とはいえません。
    • good
    • 0
この回答へのお礼

よい設計を書いていないのであまりよい回答とはいえません。

お礼日時:2005/09/06 15:11

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


おすすめ情報