0

数時間後にパラメーターが突然シフトするビデオ C++ コールバック関数があります。デバッグでは、次のようにアサートします。

void CCameraInstance::VideoCallback(void *pContext, unsigned char *pBuffer, long nWidth, long nHeight, long nFrameErrorNo)
{
   assert(nWidth < 4000);
   CCameraInstance *pThis = (CCameraInstance*)pContext;
   pThis->PaintFrame(pBuffer, nWidth, nHeight, nFrameErrorNo);
}

デバッガーがアサートで中断すると、nWidth に大きな無効な値が含まれます。ただし、nHeight は 320 (幅の値) で、nFrameErrorNo は 240 (nHeight の値) です。

どのようにパラメータがそのようにシフトすることができますか?

4

1 に答える 1

0

このシフトは、非表示の this ポインターが原因である可能性があります。http://www.learncpp.com/cpp-tutorial/8-8-the-hidden-this-pointer/

ここに貼り付けたコードから

void CCameraInstance::VideoCallback(void *pContext, unsigned char *pBuffer, long nWidth, long nHeight, long nFrameErrorNo)

コールバック関数がのメンバーであることがわかりますclass CCameraInstance

関数を静的関数として定義しているのか、通常の関数として定義しているのかわかりません。ただし、理論的には、 this ポインターを回避するには静的関数にする必要があります。C++ クラス メンバー関数を C コールバック関数として使用する

ただし、メンバー関数を静的として定義していても、C++/CLI に問題がありました。this ポインター/ハンドルはまだ存在します。

関数を次のように定義しようとすることができると思います

void CCameraInstance::VideoCallback(CCameraInstance* test,void *pContext, unsigned char *pBuffer, long nWidth, long nHeight, long nFrameErrorNo)

そして試してみてください。

C++/CLI を使用している場合は、

void CCameraInstance::VideoCallback(CCameraInstance^ test,void *pContext, unsigned char *pBuffer, long nWidth, long nHeight, long nFrameErrorNo)
于 2016-05-14T09:07:52.880 に答える