我一直在思考静态与非静态、回调函数、函数指针等问题。我的目标是访问回调接口范围之外的结构数据。我正在尝试在我的名为 TextDetect 的课程中执行此操作。当我问这个问题时,我以为我走上了正轨:使用 C 中的回调接口时避免 C++ 中的静态成员函数 但是,我仍然无法访问数据而不会丢失我最感兴趣的数据的范围。在运行时,我得到“访问冲突读取位置......”我会在下面指出它失败的地方。我将上一个问题的答案实现为以下类,完全显示(注意:vtrInitialize 是第 3 方 api 代码的一部分int vtrInitialize(const char *inifile, vtrCallback cb, void *calldata); ):
class TextDetect {
const char * inifile;
vtrImage *vtrimage;
int framecount;
public:
TextDetect();
~TextDetect();
void vtrCB(vtrTextTrack *track);
static void vtrCB_thunk(vtrTextTrack *track, void *calldata);
int vtrTest(cv::Mat);
bool DrawBox(cv::Mat&);
vtrTextTrack *texttrack;
};
TextDetect::TextDetect() : inifile("vtr.ini")
{
if (vtrInitialize(inifile, vtrCB_thunk, static_cast<void *>(this) ) == -1)
std::cout << "Error: Failure to initialize" << std::endl;
vtrimage = new vtrImage;
}
int TextDetect::vtrTest(cv::Mat imagetest)
{
/*store image data in an image structure*/
}
void TextDetect::vtrCB(vtrTextTrack *track)
{
/*send data to command line from callback */
我尝试过以多种方式复制我需要的数据,但没有任何效果(此代码是上面的延续):
//texttrack = track;
//texttrack = new vtrTextTrack (*track);
memcpy(texttrack,track,sizeof(*track));
//vtrTextTrackFree(track);
}
void TextDetect::vtrCB_thunk(vtrTextTrack *track, void *calldata)
{
static_cast<TextDetect *>(calldata)->vtrCB(track);
}
这是我想要使用数据的成员函数。Texttrack 是公共成员,因此我可能在课堂之外也需要它(此代码是上面的延续):
bool TextDetect::DrawBox(cv::Mat& tobeboxed)
{
在这行代码中,我在运行时收到了访问冲突错误(此代码是上面的延续):
if (texttrack->best->ocrconf > 90)
{
/*do some more stuff*/
}
}