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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QT vs Работа с указателями  (Прочитано 7899 раз)
dilvishdd
Гость
« : Январь 09, 2009, 20:53 »

Возникает подозрение насчет работы  указателей в QT.4.4.0
когда заливаю в таблицу данные с массива портяться указатели,
отдельно отработаный код  с использованием указателей работает нормально
Qt собиралося с помощью configure и nmake на MVS2008
« Последнее редактирование: Январь 09, 2009, 21:20 от dilvishdd » Записан
Rcus
Гость
« Ответ #1 : Январь 09, 2009, 21:08 »

Цитировать
Даже если ошибка поначалу кажется не вашей, в ваших же интересах полагать, что справедливо обратное. Это предположение помогает в отладке. Ожидаемый дефект обнаружить в коде трудно; если вы полагаете, что ошибок в вашем коде нет, найти их еще труднее.
СС2e, страница 529, стих первый.
Записан
Dendy
Гость
« Ответ #2 : Январь 09, 2009, 21:11 »

0. QT - это аббревиатура Apple QuickTime, правильно - Qt.
1. В русском языке нет слова "портяться".
2. Телепаты в отпуске.
Записан
Dendy
Гость
« Ответ #3 : Январь 09, 2009, 21:15 »

Rcus, подписываюсь.

Каждый проходит стадию "мой код клёвый, это у них всё глючит". Быстрее начнёте ставить под сомнение собственный код - быстрее обнаружите ошибку.
Записан
dilvishdd
Гость
« Ответ #4 : Январь 09, 2009, 22:03 »

прошу извинить что не кинул,просто сомневаюся что у кого то будет желание разбирать его
несколько раз перекампилировал
Код:
/*	 
/////////////////////   
           for (int i  = 0; i < n; i++)
{
                       for (int j = 0; j < n; j++)
{
matr.add_element(i*n+j+1,i,j,&matr.str);
   
}
}
///////////////////////////
*/
    for (int i  = 0; i < n;i++)
    {
        for (int j = 0; j < n;j++)
        {
            matr.add_element(i*n+j+1,i,j,&matr.str);
            ptwi = new QTableWidgetItem(QString("%1").arg(i*n+j+1));
            tbl.setItem(i, j, ptwi);

        }
    }
закоментированый код отрабатывает правильно,в то время как добавление
      ptwi = new QTableWidgetItem(QString("%1").arg(i*n+j+1));
            tbl.setItem(i, j, ptwi);
єтих строчек приводит к полной неработоспособности
« Последнее редактирование: Январь 10, 2009, 07:55 от Константин » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Январь 09, 2009, 22:16 »

Цитировать
портяться указатели

в смысле от них плохо пахнет?

Без кода сложно сказать.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #6 : Январь 10, 2009, 00:29 »

Это у меня что-то глючит, или код действительно так отформатирован?


http://i.piccy.info/i3/24/9a/b1c5e9d42275d653bfaf4a0b09b8.png
Записан

Собираю информацию по крупицам
http://webhamster.ru
dilvishdd
Гость
« Ответ #7 : Январь 10, 2009, 00:31 »

чето глючит
Записан
Rcus
Гость
« Ответ #8 : Январь 10, 2009, 01:24 »

1. Курите учебники по C /*отказывается верить, что это C++*/, точнее раздел по различным типам памяти (отличие стека и кучи).
2. Старайтесь ограничивать вложенность, код будет гораздо легче читать. Я стараюсь ограничивать себя двумя уровнями вложенности, в редких случаях используя третий уровень. (читать CC2e часть четвертая, стих 19.4, хотя лучше бы прочитать все писание)
3. Это не Qt вашу память портит, попробуйте туда поставить что-нибудь типа и переходите к пункту первому.
Код
C
char c[100];
memset(c,0,100);
 
Записан
Tonal
Гость
« Ответ #9 : Январь 11, 2009, 11:58 »

Похоже на выход за границу массива. При этом портится куча и операции с ней приводят к взрыву. Улыбающийся
Для полной уверенности, нужно тип matr, код инициализации matr, код объявления типа matr, код .add_element и код настройки tbl. Улыбающийся
Записан
Rcus
Гость
« Ответ #10 : Январь 11, 2009, 12:11 »

Код был прикреплен в 5 сообщении, но из-за сбитого форматирования читать его непросто.
Код
C
My_Struct b;
b.set_index((*current).index());
b.set_value((*current).value());
b.set_next((*current).next());
(*current).set_index(this->width()* i + j+1);
(*current).set_value(element);
(*current).set_next(&b);
nuf said
Записан
Tonal
Гость
« Ответ #11 : Январь 11, 2009, 12:24 »

Классно!
Т.е. если данные не инициализировать, и вовсю запоминать указатели на локальные объекты, то естественно из за Qt всё и упадёт! Веселый

Похоже автор про инициализацию и объекты на стеке не в курсе. Грустный
Записан
Rcus
Гость
« Ответ #12 : Январь 11, 2009, 13:00 »

Да ладно, когда я изучал C++ моей первой ошибкой было именно сохранение указателя на стековый объект (В языке Delphi нет стековых объектов, все в куче Улыбающийся)
Правда любой инструмент по контролю памяти такие ошибки ловит на раз (CodeGuard(BCB), Valgrind, BoundsChecker)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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