Russian Qt Forum
Ноябрь 25, 2024, 00:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Глюк QList или моя ошибка  (Прочитано 9983 раз)
aliks-os
Гость
« : Январь 13, 2011, 15:14 »

Есть структура

Код:
struct ConData {
    QString name;
    QString driver;
    QString dbName;
    QString host;
    QString user;
    QString password;
    int port;
    QString charset;
    int charsetIdx;
};

Загнал ее в массив

Код:
QList<ConData> connectionList;

Заполнил данными.
Далее, беру необходимый элемент массива и передаю через функцию в другую форму. После завершения работы с формой, получаю результат также в виде структуры.

Код:
ConnectionDlg *dialog = new ConnectionDlg(this);
ConData co1 = connectionList.at(curCon);  //curCon - это номер строки в массиве
ConData co = dialog->showThis(co1);

Далее, пытаюсь полученное значение подменить в массиве. И вот тут проблемы...
если делаю вот так...

Код:
connectionList.replace(curCon,co);

то программа потом вылетает, трассировка из-за чего не помогает.
А если делаю вот так, то все ок

Код:
connectionList[curCon].host = co.host;
...
и так все поля.

Подскажите, где моя ошибка и как это побороть
« Последнее редактирование: Январь 13, 2011, 15:20 от aliks-os » Записан
Fat-Zer
Гость
« Ответ #1 : Январь 13, 2011, 15:34 »

вроде ничего криминального не видно...
Цитировать
Код:
connectionList.replace(curCon,co);

то программа потом вылетает, трассировка из-за чего не помогает.
странно что не помогает, хотя бы побольше информации о том как валится... сигфолт? тогда коллстек посмотрите, где именно.

Цитировать
Код:
connectionList[curCon].host = co.host;
...
и так все поля.

Подскажите, где моя ошибка и как это побороть
почему не просто
Код:
connectionList[curCon]=co;
Записан
aliks-os
Гость
« Ответ #2 : Январь 13, 2011, 15:48 »

Если напишу просто
Код:
connectionList[curCon]=co;

то у меня тоже возникает ошибка при повторном обращении....При дебуге, ошибка возникает в
файле qatomic_i386.h
а конкретно в функции

Код:
inline bool QBasicAtomicInt::ref()
{
    unsigned char ret;
    asm volatile("lock\n"
                 "incl %0\n"
                 "setne %1"
                 : "=m" (_q_value), "=qm" (ret)
                 : "m" (_q_value)
                 : "memory");
    return ret != 0;
}


Ошибка возникает как не странное при обращении к QTreeWidget, хотя они у меня ни как не связаны
Записан
Fat-Zer
Гость
« Ответ #3 : Январь 13, 2011, 16:21 »

Цитировать
хотя бы побольше информации о том как валится

в том коде, который вы привели явных ошибок нет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Январь 13, 2011, 16:51 »

Наиболее вероятно - битая куча. Кто-то пишет по удаленному указателю или др. невалидному адресу. В результате калечится объект(ы) который не имеет к пишущему никакого отношения. Нужно запрягать отладчик на предмет проверки кучи, хотя это не всегда помогат. Простой способ - воткнуть строку (connectionList[curCon]=co;) "до и после" и так пытаться локализоваться
Записан
aliks-os
Гость
« Ответ #5 : Январь 13, 2011, 17:14 »

ну то что куча битая, я это понял. уже победил, вот таким способом.

Код:
ConData *co1 = &(connectionList[curCon]);
ConData co = *dialog->showThis(co1);
connectionList[curCon] = co;

Стал передавать в функцию указатель и она его же возвращает
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Январь 13, 2011, 17:37 »

ну то что куча битая, я это понял. уже победил, вот таким способом.

Код:
ConData *co1 = &(connectionList[curCon]);
ConData co = *dialog->showThis(co1);
connectionList[curCon] = co;

Стал передавать в функцию указатель и она его же возвращает
Ну это Вы заткнули "до следующего милиционера". Нужно найти кто бьет и устранить. И на всякий случай поставить проверку curCon < connectionList.size()
Записан
aliks-os
Гость
« Ответ #7 : Январь 13, 2011, 17:52 »

Ну это Вы заткнули "до следующего милиционера". Нужно найти кто бьет и устранить. И на всякий случай поставить проверку curCon < connectionList.size()

Согласен, буду искать еще, проверку curCon < connectionList.size() сделаю обязательно, но в данном случае ошибка была не из-за него
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Январь 13, 2011, 17:59 »

я бы конструктор копирования написал, класс-то не POD
Записан
aliks-os
Гость
« Ответ #9 : Январь 13, 2011, 18:11 »

а подробней можно?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Январь 13, 2011, 19:32 »

Копирующий конструктор типа:
ConData (const ConData& cd) : name (cd.name), и т.д. {
 
}
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Fat-Zer
Гость
« Ответ #11 : Январь 13, 2011, 20:12 »

я бы конструктор копирования написал, класс-то не POD
А в этом есть смысл? тобишь ведь он ни чем не будет отличаться от того, что по умолчанию...
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #12 : Январь 13, 2011, 20:19 »

ну вообще-то будет, по умолчанию происходит что-то типа memcpy насколько я знаю, а конструкторы кустрингов вроде не вызовуться
Записан
Fat-Zer
Гость
« Ответ #13 : Январь 13, 2011, 21:01 »

ну вообще-то будет, по умолчанию происходит что-то типа memcpy насколько я знаю, а конструкторы кустрингов вроде не вызовуться
я до недавнего времени тоже так считал, но меня образумили))
1) конструктор копирования по умолчанию вызывает оные для всех членов.
2) в данном случае будет вызываться не конструктор копирования, а оператор присваивания.

пример:
Код
C++ (Qt)
#include <iostream>
 
using namespace std;
 
struct SubStruct
{
public:
SubStruct()
{
cout<<"in substruct constructor\n";
}
SubStruct(const SubStruct&)
{
cout<<"in substruct copy constructor\n";
}
const SubStruct& operator=(const SubStruct&)
{
cout<<"in substruct operator=\n";
return *this;
}
};
 
 
struct MyStruct
{
public:
SubStruct ss;
};
 
 
int main(int , char *[])
{
cout<<"Creation:\n";
MyStruct s1, s2;
cout<<"Assigning:\n";
s2=s1;
cout<<"Copyconstructing=)\n";
MyStruct s3(s1);
 
return 0;
}
 
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #14 : Январь 13, 2011, 21:27 »

Ну, вообще советуют:
1. Если переопределяешь конструктор копирования, то и присваивание тоже переопределяй.
2. Конструктор копирования реализуется через присваивание.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.156 секунд. Запросов: 23.