-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 に答える