【发布时间】:2012-07-16 19:19:12
【问题描述】:
我一直在思考静态与非静态、回调函数、函数指针等问题...我的目标是访问回调接口范围之外的结构数据。我正在尝试在我的名为 TextDetect 的课程中执行此操作。当我问这个问题时,我以为我走上了正轨:Avoiding a static member function in c++ when using a callback interface from 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*/
}
}
【问题讨论】:
-
老实说,描述你的问题真的需要那么多代码吗?
-
你写的表格中的问题很难快速理解;也许简化它会促使更多人回答。
-
好吧,您的
memcpy肯定是一个错误:它不可能复制所有track,因为您显然在track中有指针,它们将被复制,但不是它们指向的内容到。我很容易想象,track数据在回调之外不存在。 -
@user Torsten Robitzki 说了什么。
-
有趣...轨道在该结构中确实有指针。你知道有什么解决办法吗?除了回调,我如何获取这些数据?