
No.1ベストアンサー
- 回答日時:
void* a[2];
void* b;
void* (*c)[2];
b = (void*)a;
c = (void* (*)[2])b;
ってことですか?
この回答への補足
すみません。回答いただいてから気がつきました。
void* b = a;
ではなく、
void** b = a;
が正しいですね。
で、すみません、
void* (*)
はどのような意味なのでしょうか?
参考になるURLなど教えていただけませんか?
呼び方がわからないので検索できませんでした。
Tacosan様の以下と合わせて理解できました。ありがとうございました。
---
void *a[2];
void *b;
void *(*c)[2];
とすると void *(*)[2] は c の型であり, 同時に &a の型でもあります.
したがって上の場合
c = &a;
は文法的に全く正当です.
---
No.8
- 回答日時:
void* p[2];
のとき p の型は void *[2] であり, これに対して配列からポインタへの変換を適用すると void ** となります. だから AfxBeginThread の呼び出しを今のままにするなら, barThread の中では
bar((void **)p);
のようにキャストすれば十分だし, 受け取る bar の方も
void bar(void **p)
{
HANDLE handle = *(HANDLE*)p[0];
HANDLE event = *(HANDLE*)p[1];
// 以下略
}
でいいはず.
逆に, bar を今のままにするなら foo における AfxBeginThread の呼び出しを
AfxBeginThread(barThread, &p);
としないと本来はアウト.
この回答への補足
そうですね。仰られる通り、
void bar(void **p)
とし、
*(HANDLE*)p[0];
とするのが自然ですね。
No.7
- 回答日時:
AfxBeginThreadの引数等がLPVOIDというのが引っかかってるんでしょうか?
handleとeventは、変更する必要はなさそうなんですが。変更しないのであれば、ポインタにする必要もないので、
HANDLE h[2] = {handle, event};
AfxBeginThread(bar, (LPVOID)h);
として、
void bar(LPVOID p)
{
HANDLE* ph = (HANDLE*)p;
HANDLE handle = ph[0];
HANDLE event = ph[1];
...
}
でいいような気がしますが。
この回答への補足
すみません。例が良くなかったですね。
ポインタにする必要がある場合と仮定していただけると幸いです。
お手数おかけしてすみません。
No.6
- 回答日時:
キャストしますか?
やっぱりダブルポインタでしょうか?
ひょっとしたらvoid*()[]で通るかもしれませんが
少なくとも配列の長さは入れても意味がないと思います。
この回答への補足
void* a[2];
void** b = a;
void* c[2] = (void*()[])b;
ということでしょうか?
error C2090: 関数は配列を返せません。
error C2066: 関数型へのキャストが正しくありません。
error C2440: '初期化中' : 'void **(__cdecl *)(void)' から 'void *[2]' に変換できません。
配列型への変換はありませんが、参照またはポインタから配列への変換があります。
となりました。
ダブルポインタです。
キャストはしなくてもよい気はしています。
なんだかふわふわした質問ですみません...
No.5
- 回答日時:
余談ですが
void *a[2];
void *b;
void *(*c)[2];
とすると void *(*)[2] は c の型であり, 同時に &a の型でもあります. したがって上の場合
c = &a;
は文法的に全く正当です. 見た人間は驚くかもしれませんが.
なお
「仮にキャストしたい場合はどのようにしたらよいかありますでしょうか?」
についてはどういう場面を想定しているかわからないのでパス. どういう式でどこにキャストを明示するときの話かが分かれば方法を書くかも.
この回答への補足
使用例は、
void bar(void*(*p)[2])
{
ULONG addr = 0x10;
ULONG data = 0;
HANDLE handle = *(HANDLE*)(*p)[0];
HANDLE event = *(HANDLE*)(*p)[1];
while(data == 0){
read(handle, addr, &data);
}
SetEvent(event);
}
UINT barThread(void* p)
{
bar((void*(*)[2])p);
return 0;
}
void foo(HANDLE handle, HANDLE event)
{
void* p[2];
p[0] = &handle;
p[1] = &event;
AfxBeginThread(barThread, p);
}
のような感じです。
キャストを明示的にする意味はあまりなさそうですかね...
No.4
- 回答日時:
(void* (*)[2])はvoid* [2]へのポインタです。
void* c[2];とすると、cはaと同じくvoid*の配列になるので、代入することができません。
なので、ポインタにしています。
そもそも、cをどのように使用したいのでしょうか?
この回答への補足
(void* (*)[2])の意味はなんとなくわかるのですが、もっと深く知りたかったのでお聞きしました。
使用例は、
void bar(void*(*p)[2])
{
ULONG addr = 0x10;
ULONG data = 0;
HANDLE handle = *(HANDLE*)(*p)[0];
HANDLE event = *(HANDLE*)(*p)[1];
while(data == 0){
read(handle, addr, &data);
}
SetEvent(event);
}
UINT barThread(void* p)
{
bar((void*(*)[2])p);
return 0;
}
void foo(HANDLE handle, HANDLE event)
{
void* p[2];
p[0] = &handle;
p[1] = &event;
AfxBeginThread(barThread, p);
}
のような感じです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# プログラミング実行後の表示される値を答えよ #include<stdio.h> void main( 7 2022/05/20 00:07
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# C言語 コードを書いたのですが上手く実行出来なかったです。どこが間違ってますか? 【作成したいもの】 1 2022/05/04 11:36
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マルチメディアタイマー
-
const_castのつかいどころを教...
-
戻り値を返す関数の前に(void)...
-
静的でないメンバ関数の呼び出...
-
【gcc・cygwin】multiple defin...
-
既定のコンストラクタがありま...
-
TimerProc コールバック関数を...
-
int main()、void main()、void...
-
定義した文字列を wchar_t 系の...
-
qsortの引数について
-
組み込みマイコン
-
マルチメディアタイマーの使用方法
-
スレッドの作成について(pthre...
-
DirectInput でのエラー
-
VC++でGetKeyboardStateがうま...
-
void*型の配列について
-
c言語 引数のvoidについて
-
C++にてtemplateで受け取った任...
-
C#でテンキーの操作は可能でし...
-
多重定義が起きている?--lnk20...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
多重定義が起きている?--lnk20...
-
const_castのつかいどころを教...
-
C++にてtemplateで受け取った任...
-
既定のコンストラクタがありま...
-
戻り値を返す関数の前に(void)...
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
C# KeyDownイベントでショート...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
gcc: incompatible pointer type
-
_beginthreadにて発生するコン...
-
C#でラジオボタンを設定に記録...
-
C#でテンキーの操作は可能でし...
-
C++別のオブジェクトからメンバ...
-
CTabCtrl:TABインデックス単位...
-
見た目は同じソースなのにエラ...
-
pictureboxの画像を削除するには?
-
【VC++6.0】イベントハンドラ関...
おすすめ情報