我一直在徘徊在这个问题的静态与非静态,回调函数,函数指针等...我的目标是访问一个结构的数据范围之外我的回调界面。我正在尝试在我的课程TextDetect中执行此操作。当我提出这个问题时,我认为自己正处于正轨:Avoiding a static member function in c++ when using a callback interface from C 但是,我仍然无法访问数据而不会丢失我最感兴趣的数据范围。在运行时,我得到“访问违规读取位置......”我会在下面指出它失败的地方。 (注意:vtrInitialize是第三方api代码的一部分int vtrInitialize(const char * inifile,vtrCallback cb,void * calldata);):访问变量超出回调范围C++
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*/
}
}
老实说,是真的那么多的代码来描述你的问题? – 2012-07-17 19:49:35
你写在表单上的问题很难快速理解;也许简化它会促使更多人回答。 – 2012-07-17 19:51:42
嗯,你的'memcpy'确实是一个错误:它不可能复制'track'的所有内容,因为你显然在'track'中有指针,它将被复制,但不是它们指向的内容。我可以很容易想象,在回调之外,“track”数据不存在。 – fork0 2012-07-17 19:57:51