ハンドルの配列を関数から返したいのですが、エラーがでます。
初歩的であることはわかるんですけど、治し方がわかりません(泣)。
error C2440: '=' : 'struct HHOOK__ ** ' から
'struct HHOOK__ *[2]' に変換することはできません。
配列型への変換はありませんが、参照またはポインタから配列への変換があります。
main--------------------------------------------------
HHOOK g_hhook[2];
g_hhook = SetWinMsgHook(dwThreadId);
関数の呼び出し先---------------------------------------
HHOOK s_hhook[2];
HHOOK* WINAPI SetWinMsgHook(DWORD dwThreadId)
{
s_hhook[0] = SetWindowsHookEx(…
s_hhook[1] = SetWindowsHookEx(…
return s_hhook;
}
配列を戻り値で返すことは出来ないような。
引数に指定してみるのはどうでしょうか?
>g_hhook = SetWinMsgHook(dwThreadId);
SetWinMsgHook(dwThreadId, g_hhook);
>HHOOK* WINAPI SetWinMsgHook(DWORD dwThreadId)
void* WINAPI SetWinMsgHook(DWORD dwThreadId, HHOOK hooks[])
{
hooks[0] = ・・・・
hooks[1] = ・・・・
}
もしくは2つなら構造体(またはstd::pair)にするとか。
あーそうですよね。固執して柔軟性を欠いてました。
ポインタ渡しや構造体のポインタを戻り値にする方法がありますよね
でもなぜ配列を戻り値にできないのでしょうか?
「仕様です」以外で誰か教えて頂けませんか?
できない根拠は「仕様だから」であってそれ以上でも以下でもないっす。
そういう仕様を決めた Rationale が知りたい、ということでしょうか?
歴史的事情って奴。
C という言語が設計された当時のコンピュータ (というか CPU) の性能では
関数の返却値に配列を返すような重い処理は避けるべきと判断されたから。
引数に先頭要素へのポインタを渡すほうが適切と判断されたから。
その仕様がいまだに引き継がれているだけのこと。
現代 C/C++ でも配列を直接返すことは認められないけど、
配列を構造体にくるめばできるようになってる。
struct wrapper_of_array {
int value[200];
};
struct wrapper_of_array testfunc() { ... }
不必要に処理が重くなると思うが。
Rationaleが知りたかったです。(納得したいという願望を満たすために)
おかげですっきりしました。ありがとうございました。
裏技!?まで教えて頂き、大満足です。