Название: Зверский баг Отправлено: Dodge от Апрель 16, 2008, 13:09 Недавно словил зверский баг у себя в проекте - при вызове слота в результате эмита сигнала с параметрами, в слоте аргумента в буквальном смысле нету. Приведу пример для наглядности:
Код: void MyQObjectBasedClass::valueChanged( QDateTime dt ) { Код: value: 0x0 Эмитит сигнал Qt-виджет(QDateTimeEdit). Коннект: Код: QDateTimeEdit * edit = new QDateTimeEdit; К эмиту приводит: Код: edit->setDateTime( .../*тут например QDateTime::currentDateTime(), хотя писал и константы*/ ); Такая ситуация со всеми (покрайней мере "моими") слотами. Баг именно у меня в проекте, т.к. потестив виджет отдельно, такогоже эффекта не получил. Есть какие нибудь мысли по этому поводу? Название: Re: Зверский баг Отправлено: ритт от Апрель 16, 2008, 13:25 ага...есть одна:
замени Код: connect( edit, SIGNAL( dateTimeChanged(QDateTime) ), Код: connect( edit, SIGNAL( dateTimeChanged ( const QDateTime &) ), myobject, SLOT( valueChanged ( const QDateTime &) ) ); Название: Re: Зверский баг Отправлено: Dodge от Апрель 16, 2008, 19:23 что за бред... вы прежде чем писать проверьте... ссылка не есть тип...
З.Ы. как я понимаю вы же в кандидаты перенесли, хочется обратно... Название: Re: Зверский баг Отправлено: Dodge от Апрель 16, 2008, 19:35 ах да, Qt 4.3.2
Название: Re: Зверский баг Отправлено: pastor от Апрель 16, 2008, 19:58 что за бред... вы прежде чем писать проверьте... ссылка не есть тип... ??? Попрошу здесь поподробнее Upd: Проверил, все работает нормально, Qt 4.3.4 Код: connect(dateTimeEdit, SIGNAL(dateTimeChanged(QDateTime)), this, SLOT(valueChanged1(QDateTime))); Как вариант, делаем апдейт до 4.3.4 Название: Re: Зверский баг Отправлено: Dodge от Апрель 16, 2008, 21:08 Цитировать Проверил, все работает нормально, Qt 4.3.4 Очень интересно, дело в том, что я пробовал вариант со ссылкой, но коннект не проходил......хотя с др стороны, в простой то программе у меня тоже все работает как надо! Мне дико интересно, что может привести к такому эффекту... Мистика! в мок-файле(файл сгенерированный моком :)) идет явный вызов метода, в этом случае даже если объект ссылка на который передается - "умер", мы должны получить в слоте адресс того места(не то о чем вы подумали, имеется ввиду память) где был объект. Название: Re: Зверский баг Отправлено: Вячеслав от Апрель 16, 2008, 21:25 ...хотя с др стороны, в простой то программе у меня тоже все работает как надо! Мне дико интересно, что может привести к такому эффекту... Мистика! Ну может быть "провалы"(ляпы ) в памяти ;) Самое тупое - объект не в куче,а в стеке ;) Цитируя gmane.comp.db.firebird.russian - "ЫЩИ ХЛУБЖЕ" ;) А серьезно - пробегись шагами по проге с момента emit'а глядя на стек - может чего углядишь ( на скорую руку). Название: Re: Зверский баг Отправлено: Alex03 от Апрель 17, 2008, 08:29 Насколько я понимаю то что
Код: void MyQObjectBasedClass::valueChanged( QDateTime dt ) { Код: value: 0x0 Т.е. на стеке или в регистрах проца - зависит от архитектуры проца, компилятора, его опций оптимизации, от самого передаваемого объекта (его размера) и т.д. В данном случае dt содержит единственный указатель на QDateTimePrivate, поэтому легко может уместиться в регистр проца... В общем проблема не в Qt а к компиляторе. Поэтому Dodge, огласи платформу, ОС, компилятор и его версию и опции... Точно не уверен (надо смотреть стантарт), но в таком случае если в коде есть взятие адреса от переменно которая может быть переданна в регистре проца компилятор должен нагенерить код по переносу этой переменной в стек и давать адрес именно этой новой переменной. Вот это: Код: void MyQObjectBasedClass::valueChanged( QDateTime dt ) { Название: Re: Зверский баг Отправлено: Dodge от Апрель 17, 2008, 13:45 Поэтому Dodge, огласи платформу, ОС, компилятор и его версию и опции... Linux gentoo 32bit, g++(4.2.2), использую систему сборки cmake(2.4-path 7), поэтому напрямую компилятору ничего не задаю :)Вот это: ну я чесно говоря такого вопроса не ожидал :)... ошибку сигментации выдает, объекта то нету :oКод: void MyQObjectBasedClass::valueChanged( QDateTime dt ) { Название: Re: Зверский баг Отправлено: Tonal от Апрель 17, 2008, 14:04 Сигнал не между потоками кидается?
Название: Re: Зверский баг Отправлено: pastor от Апрель 17, 2008, 14:28 Хм, интересная ситуация получаеться...
У меня такой вот вопросик: а обыекты, приведенные ниже, нигде не удаляються на момент испускания (или на помент обработки) сигнала: Код: QDateTimeEdit * edit = new QDateTimeEdit; Название: Re: Зверский баг Отправлено: Dodge от Апрель 17, 2008, 16:12 Сигнал не между потоками кидается? нет, все происходит в основном потоке.Цитировать Хм, интересная ситуация получаеться... покрайней мере мной нет. У меня такой вот вопросик: а обыекты, приведенные ниже, нигде не удаляються на момент испускания (или на помент обработки) сигнала: Code: QDateTimeEdit * edit = new QDateTimeEdit; MyQObjectBasedClass * myobject = new MyQObjectBasedClass; проверку на валидность сендера ставил + вызывал метод сендера и получал от него правильный результат: Код: if( QDateTimeEdit * editor = qobject_cast<QDateTimeEdit*>(sender()) ) приемник не проверял, операясь на то, что если бы приемника небыло, то в следствии попытки вызвать его слот, программа бы вылетала с ошибкой сигментации. Название: Re: Зверский баг Отправлено: Tonal от Апрель 17, 2008, 16:29 Получить такое же поведение можно примерно так:
Код: void f(int i) { Хотя на этом тесте екзешник деланный мингвой высыпается на f(i). P.S. Похоже ты наткнулся на какой то баг gcc + Qt. Я на подобные в багланде часто натыкался. Попробуй сделать минимальный пример и послать тролям. Название: Re: Зверский баг Отправлено: Tonal от Апрель 17, 2008, 16:43 Вот ещё один примерчег:
Код: struct test_t { |