Указатель совмещенный в GTK - PullRequest
0 голосов
/ 06 мая 2011

У меня есть std :: vetor с моей структурой, он глобально размещается в одном файле, а затем некоторая структура передается другой функции, которая помещается в другой файл, а затем снова передается другой функции, которая помещается еще в другую. файл. Возможно ли, что указатель каким-то образом теряется, потому что я получаю нарушение доступа при вызове последней функции.

РЕДАКТИРОВАТЬ: Когда я передал указатель на структуру вместо структуры, он работал.

Я так не получаю эту доску, я не могу отредактировать свой предыдущий пост ... В любом случае, передача указателя также не помогла>.> Возможно, моя функция обратного вызова неверна, я использую поле события, чтобы перехватить 2 раза событие клика по метке :

void test(GtkWidget* widget, GdkEventButton * event, gpointer callback_data) 
{
    Profil* profil = (Profil*) callback_data;
    std::cout << profil->username << std::endl; //<--here it goes nuts
    if (event->type == GDK_2BUTTON_PRESS && event->button == 1) OknoPogody(profil);
}

void Glowne_Okno (Profil profil) // <- эта функция в качестве аргумента принимает структуру Profil </p>

который передается раньше и в Glowne_Okno я вызываю функцию обратного вызова:

g_signal_connect (G_OBJECT (Eventy [0]), "button_press_event", G_CALLBACK (test), & profil);

Прежде чем я также позвонил: gtk_widget_set_events (Eventy [0], GDK_BUTTON_PRESS_MASK)

1 Ответ

0 голосов
/ 06 мая 2011

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

Поскольку вывы используете C ++, я настоятельно рекомендую вам использовать оболочку gtkmm C ++ .Это дает вам безопасный метод подключения к сигналам и возможность использовать функторы в качестве обработчиков.Я не уверен, предоставляет ли он (или, скорее, это служебная библиотека sigc) способ связывания аргументов с функторами, но если это не так, он будет работать с boost::bind или std::bind из C ++ 0x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...