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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- Windows 10 (続き2)2つのウィンドウ選択時の表示について 3 2023/08/21 22:41
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
LPSTR型の初期化について
-
C言語のポインタに直接アドレス...
-
c言語で任意のファイルから読み...
-
関数の引数をvoid*でキャストする
-
ポインタについて
-
アプリを32bitから64bit移行
-
構造体の中の構造体
-
VBはCを混乱させる?
-
ReadFileの読み込みエラーについて
-
参照型で受け取った引数をポイ...
-
【C言語】戻り値が構造体の関数
-
CWnd::EnableWindow()の扱い方
-
ポインタいついて教えてください
-
CObArrayとCPtrArrayの違い
-
NULLとブランクの違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
C言語の関数と配列に関する質問
-
LPSTR型の初期化について
-
戻り値で構造体を返すことは可...
-
参照型で受け取った引数をポイ...
-
構造体とfscanf
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
Cで作成したDLL関数をVBから呼...
-
C言語でのconstを返す関数
-
main(int argc,char **argv[])...
-
DLL<->VB間での受け渡し(文字...
-
エラーの意味
-
PASCALとFARの意味
-
ハンドルはポインタか
-
CWnd::EnableWindow()の扱い方
おすすめ情報