2

私は使用してopenCVおり、いくつかのコールバック関数が必要です。これらのcallback関数は、限られたパラメーターのみを受け入れます。したがって、これらの関数にさらに変数が必要な場合は、グローバル変数を作成して関数間で切り替える必要があります。

たとえば、コールバック関数は次のとおりです。

    void mouse_callback(int event, int x, int y, int flags, void* param);
// params : addition parameter, and just one, I need more parameters for this callback.
// but cannot, so make global variable.

そして、私はそれをすべきではないので(グローバル変数を作成する)、配列を作成することにしまし(void*)たが、各メンバーのサイズが異なる可能性があるため、Cはこれを作成できないのではないかと心配しています。

私の質問は: (void*) の配列を作成できますか? そうでない場合、どうすれば問題を解決できますか: コールバック関数を使用し、グローバル変数を作成する必要はありません。

ありがとう :)

4

3 に答える 3

7

必要なすべての値を保持できる を定義し、structそのアドレスをparam引数として渡します。

struct my_type
{
    int i;
    char c;
};

void my_mouse_callback(int event, int x, int y, int flags, void* param)
{
    struct my_type* t = param;
}

登録メカニズムが何であるかはわかりませんがparam、コールバック関数の呼び出し期間中、 が指すオブジェクトの有効期間が有効であることを確認する必要があります。

struct my_type* mouse_param = malloc(sizeof(*mouse_param));
mouse_param->i = 4;
mouse_param->c = 'a';

register_mouse_callback(my_mouse_callback, mouse_param);

具体的には、次のことは行わないでください。

{
    struct my_type mouse_param = { 4, 'a' };
    register_mouse_callback(my_mouse_callback, &mouse_param);
} /* 'mouse_param' would be a dangling pointer in the callback. */
于 2012-08-14T16:12:19.473 に答える
3

void *ポインタには一定のサイズがあるため、配列を作成できますが、これらのポインタをキャストせずに使用することはできません。

于 2012-08-14T16:12:15.140 に答える
1

パラメータを含む構造体を指す void* を送信する必要があります。コールバック関数では、この型 (void*) を次のようにパラメーターを使用して struct* にキャストし直します。

typedef struct {
  int event;
  int x;
  int y;
  int flags;
} params;

void mouse_callback(void *data) {
   params* param  = (params*) data;
   // now you can use param->x or param->y to access the parameters
}

パラメータを渡すには、paramstruct を作成し、そのアドレスを (void*) にキャストする必要があります。

paramstruct myparams;
myparams.x = 2;
myparams.y = 1;

mouse_callback( (void*) &myparams );
于 2012-08-14T16:16:59.273 に答える