Передача целого числа как gpointer в g_signal_connect - PullRequest
1 голос
/ 18 апреля 2019

Я попытался найти похожий вопрос, но не смог найти решения.

У меня есть часть программного обеспечения, написанная на C с использованием GTK3, и я пытаюсь настроить обратный вызов для нажатия кнопкина моем графическом интерфейсе.Предполагается, что код передает целое число в качестве аргумента, чтобы сообщить моей функции обратного вызова, на какое окно графического интерфейса обращаться.

void main_gui()
{
    int number = 5;

    g_signal_connect(button,
                    "clicked",
                    G_CALLBACK(callback_func),
                    (gpointer*) &num);
}

void callback_func(gpointer *data)
{
    int number;
    number = (int*)data;
    printf("Number: %d\n", number);
}

Проблема заключается в том, что всякий раз, когда я пытаюсь привести число к целому числу и проверить его число (через оператор печати) возвращает неверный номер.

1 Ответ

0 голосов
/ 18 апреля 2019

Во-первых, эта функция на самом деле принимает gpointer* или просто gpointer?Последнее кажется более вероятным, поскольку gpointer является void *.

Во-вторых, вы передаете адрес локальной переменной &number, а не ее значение.Не делай этого.Локальная переменная находится в стеке и, вероятно, не будет существовать после выхода из вашей функции (что происходит до вызова вашего обратного вызова).Просто передайте приведенное значение как необходимый тип: (gpointer)number Затем, когда вы захотите его использовать, приведите его обратно: (int)data

Вот обновленный код:

void main_gui()
{
    int number = 5;

    g_signal_connect(button,
                    "clicked",
                    G_CALLBACK(callback_func),
                    //(gpointer*) &num);
                    (gpointer)number);
}

//void callback_func(gpointer *data)
void callback_func(gpointer data)
{
    int number;
    //number = (int*)data;
    number = (int)data;

    printf("Number: %d\n", number);
}
...