我一直在徘徊在這個問題的靜態與非靜態,回調函數,函數指針等...我的目標是訪問一個結構的數據範圍之外我的回調界面。我正在嘗試在我的課程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