電子書籍の厳選無料作品が豊富!

ウィンドウプロシージャ関数を以下の様に配列で定義したいのですが、コンパイルエラーとなってしまいます。この問題の解決方法をご存知の方がおりましたらご教示ください。

LRESULT CALLBACK WndProcA(…) {
return DefWindowProc (…) ;
}
LRESULT CALLBACK WndProcB(…) {
return DefWindowProc (…) ;
}
LRESULT CALLBACK WndProcC(…) {
return DefWindowProc (…) ;
}

int WINAPI WinMain(…){

static WNDPROC (*finc[])() = {
(WNDPROC)WndProcA,
(WNDPROC)WndProcB,
(WNDPROC)WndProcC
};

A 回答 (2件)

いま確認できる環境がありませんが。



WNDPROC (*finc[])()
だと
『「WNDPROC 名前()というプロトタイプの関数」へのポインタ』の配列
である、配列fincの宣言になります。
よって、fincの各要素(finc[0],finc[1]...)は「引数無し、戻り値WNDPROCの関数へのポインタ」です。
それを、(WNDPROC)WndProcA,等と、WNDPROC型で初期化しようとしています。

「引数無し、戻り値WNDPROCの関数へのポインタ」 と 「WNDPROC型」は別のものでは?

まずは、具体的にどんなエラーメッセージになっているか、書いてください。
「WNDPROCはWNDPROC (*)()に変換できない」とかいうものではないですか?

この回答への補足

考察ありがとうございます。エラーメッセージは先の回答者さんに補足コメントしました。

やりたいことは、複数ウインドをループで作りたくウィンドウプロシージャ関数を配列にする必要があるち考えました。しかし、その後下記のように関数にすれば代用できると思いつき、試したところうまく実装できました。

WNDPROC getWndProc(int no){
WNDPROC f;
switch(no){
case 1:f = WndProcA;break;
case 2:f = WndProcB;break;
case 3:f = WndProcC;break;
}
return f;
}

よって、本件の質問はCloseとさせていただきます。
お騒がせしました。

補足日時:2014/10/11 19:13
    • good
    • 0

私がわかるわけじゃないですが、なぜコンパイルエラーのエラーメッセージを書きませんか。

この回答への補足

失礼しました。エラーメッセージは以下です。
1>c:\users\...\functable\source1.cpp(93) : error C2440: '初期化中' : 'WNDPROC' から 'WNDPROC (__cdecl *)(void)' に変換できません。
1> この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。

補足日時:2014/10/11 18:40
    • good
    • 0

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