初歩的な型変換ができません

解決


モルスァ  2007-01-16 19:25:37  No: 64226

ハンドルの配列を関数から返したいのですが、エラーがでます。
初歩的であることはわかるんですけど、治し方がわかりません(泣)。

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;
}


Blue  2007-01-16 19:33:26  No: 64227

配列を戻り値で返すことは出来ないような。
引数に指定してみるのはどうでしょうか?

>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)にするとか。


モルスァ  2007-01-16 20:05:21  No: 64228

あーそうですよね。固執して柔軟性を欠いてました。
ポインタ渡しや構造体のポインタを戻り値にする方法がありますよね

でもなぜ配列を戻り値にできないのでしょうか?
「仕様です」以外で誰か教えて頂けませんか?


tetrapod  2007-01-16 20:35:06  No: 64229

できない根拠は「仕様だから」であってそれ以上でも以下でもないっす。
そういう仕様を決めた Rationale が知りたい、ということでしょうか?

歴史的事情って奴。
C という言語が設計された当時のコンピュータ (というか CPU) の性能では
関数の返却値に配列を返すような重い処理は避けるべきと判断されたから。
引数に先頭要素へのポインタを渡すほうが適切と判断されたから。
その仕様がいまだに引き継がれているだけのこと。

現代 C/C++ でも配列を直接返すことは認められないけど、
配列を構造体にくるめばできるようになってる。
struct wrapper_of_array {
  int value[200];
};
struct wrapper_of_array testfunc() { ... }
不必要に処理が重くなると思うが。


モルスァ  2007-01-16 20:55:38  No: 64230

Rationaleが知りたかったです。(納得したいという願望を満たすために)
おかげですっきりしました。ありがとうございました。

裏技!?まで教えて頂き、大満足です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加