-1

我在我的代码中定义整数数组:

unsigned int tara[1024][3];
unsigned int data[1024][4];

我有存储结构,允许我将它们传递为void*

 struct storage {
     unsigned int (*data)[4];
     unsigned int (*tara)[3];
 };

这是我对上面结构的使用:

 int main() {
   unsigned int tara[1024][3];
   unsigned int data[1024][4];

   storage but_data;
   but_data.data = data;
   but_data.tara = tara;
   tara_button.setCallback(taraButtonCallback, (void*)&but_data);  //Some UI class
   while(true);   //The program
   return 0;
 }

在回调中,这是我尝试访问数据的方式:

bool taraButtonCallback(Opencv_Button* but, void* but_data)
{
    storage* data_struct = (storage*)but_data;
    int max = -5;
    int max_value = 0;
    cout<<data_struct->data[0][0]<<'\n';  //!!ERROR!!
    return true;
}

这是我得到的运行时错误:

OpenCV.exe中 0x00394f1c处的未处理异常:0xC0000005访问冲突读取位置0x00000005

编辑:

问题与定义在哪里无关but_data!此回调有效:

bool taraButtonCallback(Opencv_Button* but, void* but_data)
{
    storage* data = (storage*)but_data;
    set_tara(data->data, data->tara, *data->mat);
    *(data->tara_set) = true;
    return true;
}
void set_tara(unsigned int data[][4], unsigned int tara[][3], Mat &UI_bot)
{
    UI_bot = Scalar(0, 0, 0);
    for(int x=0; x<cam_frame_width; x++) {
        tara[x][0]=data[x][0];
        tara[x][1]=data[x][1];
        tara[x][2]=data[x][2];
    }
}
4

3 回答 3

0

在调用回调时,but_data 已经被销毁:

storage but_data;

它是在本地分配的,这意味着它的生命周期受限于当前函数的结束。函数完成后,它不再存在,回调使用一个悬空指针。

于 2013-02-27T17:17:15.050 回答
0

只需将它分配给一个变量并打印它

 int taraButtonCallback(void* but_data)
 {
      struct storage* data = ( struct storage*)but_data;
      int max = -5;
      int max_value = 0;
      int val = data->data[0][0];
      cout <<val ;  //!!works!!
      return 0;
   }

我认为 cout 在这种情况下无法处理 [][] .. 我不确定为什么有人可以启发我们俩

于 2013-02-27T18:30:25.427 回答
-1

您可以尝试像这样分配变量storage but_data

storage *but_data = new storage;

有效地创建一个具有无限生命周期的变量。比你定义你的回调函数有点不同(因为你已经有一个指针,所以你不需要变量的地址) - 像这样:

tara_button.setCallback(taraButtonCallback, (void*)but_data);
//note the lack of '&' sign before the but_data variable name

只是不要忘记在不再需要它后将其删除!

delete but_data;
于 2013-02-27T18:39:40.430 回答