Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QList<MyObject*> непонятное поведение, Изменяется при передаче в качестве аргум 
:(
    Опции темы
Vasya
Дата 11.2.2016, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 5.7.2003

Репутация: нет
Всего: нет



Привет, 
У меня есть класс :
Код

class Drv : public QObject {
public:
QList<MyObject*> members;
.....


и есть функция имеющая :
Код

void print(Drv &d) {
qDebug() << d.members.count();
}


И вот что происходит, если до вызова метода print(Drv &d) d.members.count() равен 10, то в методе print()  он либо равен 19520015, либо вылетаем с sigfault. Не могу понять, что происходит с членами класса, я ведь его передаю по ссылке или указателю(пробовал:)). Хотя в  отладчике в методе print(Drv &d) виден класс с его members-ами, все в порядке, даже d.members.count() показывет верное число. Т е breakpiont стоит на qDEbug() << d.members.count(), в этот момент в отладчике видно, что members.count() == 10, но этот шаг приводит к краху.

Спасибо!

Это сообщение отредактировал(а) Vasya - 11.2.2016, 09:54
PM MAIL   Вверх
Guinness
Дата 11.2.2016, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Код

class MyObject
{
};

class Drv : public QObject
{
public:
    QList<MyObject*> members;
};

void print(Drv &d)
{
    qDebug() << d.members.count();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Drv d;
    for (int i = 0; i < 10; ++i) {
        d.members.append(new MyObject);
    }

    qDebug() << d.members.count();

    print(d);

    a.exec();
}


У меня всё работает. Выводит:
Цитата

>>> 10
>>> 10

Приведите минимальный пример, где воспроизводится.
PM MAIL   Вверх
Vasya
Дата 11.2.2016, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 5.7.2003

Репутация: нет
Всего: нет



В том то и ж...а.... Я тоже попробовал так, без ничего , и все работало.

Реальный кусок кода:

Код

    qDebug() << m_ord.m_dishes.count();
    p.printService(FF_SettingsDrv::value(SD_REMINDER).toInt(), &m_ord);
    qDebug() << m_ord.m_dishes.count();


а вот p.printService:

Код

bool OD_Print::printService(int remind, OD_Drv *d)
{
    QMap<int, float> list;
    QMap<QString, QList<int> > printSchema;

    //if (!d->openDB())
    //    return false;

    qDebug() << d->m_dishes.count();
    return true;


Как видим, ничего с *d не происходит, просто культурно просим распечатать количество элементов. Либо печатается безумное число, ли крах. Если не крах, то после выхода из printService снова печатается корректное число.

Добавлено через 13 минут и 52 секунды
На всякий случай, переменную d переименовал в drv. Qt все же)). Безрезультатно
PM MAIL   Вверх
Guinness
Дата 11.2.2016, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Ситуация забавная, единственное, что пока могу предложить сделать - это поставить отладочную печать в конструктор, копирующий конструктор, конструктор перемещения, деструктор.

Добавлено через 32 секунды
класса OD_Drv
PM MAIL   Вверх
ss
Дата 11.2.2016, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 17.5.2007

Репутация: нет
Всего: нет



попробуй clear, make, rebuild проекта сделать. Иногда бывает что сборка старая остается

Это сообщение отредактировал(а) ss - 11.2.2016, 23:17
PM MAIL   Вверх
Vasya
Дата 17.2.2016, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 5.7.2003

Репутация: нет
Всего: нет



Цитата(ss @ 11.2.2016,  23:15)
попробуй clear, make, rebuild проекта сделать. Иногда бывает что сборка старая остается

)) уж сколько раз пробовал 
аналогичная ситуация, но в другом классе, прокатила, проблему решил переделыванием кода. Так и не понял, в чем прикол
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0711 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.