Russian Qt Forum

Qt => Общие вопросы => Тема начата: dilvishdd от Январь 09, 2009, 20:53



Название: QT vs Работа с указателями
Отправлено: dilvishdd от Январь 09, 2009, 20:53
Возникает подозрение насчет работы  указателей в QT.4.4.0
когда заливаю в таблицу данные с массива портяться указатели,
отдельно отработаный код  с использованием указателей работает нормально
Qt собиралося с помощью configure и nmake на MVS2008


Название: Re: QT vs Работа с указателями
Отправлено: Rcus от Январь 09, 2009, 21:08
Цитировать
Даже если ошибка поначалу кажется не вашей, в ваших же интересах полагать, что справедливо обратное. Это предположение помогает в отладке. Ожидаемый дефект обнаружить в коде трудно; если вы полагаете, что ошибок в вашем коде нет, найти их еще труднее.
СС2e, страница 529, стих первый.


Название: Re: QT vs Работа с указателями
Отправлено: Dendy от Январь 09, 2009, 21:11
0. QT - это аббревиатура Apple QuickTime, правильно - Qt.
1. В русском языке нет слова "портяться".
2. Телепаты в отпуске.


Название: Re: QT vs Работа с указателями
Отправлено: Dendy от Январь 09, 2009, 21:15
Rcus, подписываюсь.

Каждый проходит стадию "мой код клёвый, это у них всё глючит". Быстрее начнёте ставить под сомнение собственный код - быстрее обнаружите ошибку.


Название: Re: QT vs Работа с указателями
Отправлено: dilvishdd от Январь 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);
єтих строчек приводит к полной неработоспособности


Название: Re: QT vs Работа с указателями
Отправлено: Alex Custov от Январь 09, 2009, 22:16
Цитировать
портяться указатели

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

Без кода сложно сказать.


Название: Re: QT vs Работа с указателями
Отправлено: xintrea от Январь 10, 2009, 00:29
Это у меня что-то глючит, или код действительно так отформатирован?

(http://i.piccy.info/i3/71/e8/3f892a2de413c248f261a02b3c4b.jpeg) (http://i.piccy.info/i3/24/9a/b1c5e9d42275d653bfaf4a0b09b8.png)
http://i.piccy.info/i3/24/9a/b1c5e9d42275d653bfaf4a0b09b8.png (http://i.piccy.info/i3/24/9a/b1c5e9d42275d653bfaf4a0b09b8.png)


Название: Re: QT vs Работа с указателями
Отправлено: dilvishdd от Январь 10, 2009, 00:31
чето глючит


Название: Re: QT vs Работа с указателями
Отправлено: Rcus от Январь 10, 2009, 01:24
1. Курите учебники по C /*отказывается верить, что это C++*/, точнее раздел по различным типам памяти (отличие стека и кучи).
2. Старайтесь ограничивать вложенность, код будет гораздо легче читать. Я стараюсь ограничивать себя двумя уровнями вложенности, в редких случаях используя третий уровень. (читать CC2e часть четвертая, стих 19.4, хотя лучше бы прочитать все писание)
3. Это не Qt вашу память портит, попробуйте туда поставить что-нибудь типа и переходите к пункту первому.
Код
C
char c[100];
memset(c,0,100);
 


Название: Re: QT vs Работа с указателями
Отправлено: Tonal от Январь 11, 2009, 11:58
Похоже на выход за границу массива. При этом портится куча и операции с ней приводят к взрыву. :)
Для полной уверенности, нужно тип matr, код инициализации matr, код объявления типа matr, код .add_element и код настройки tbl. :)


Название: Re: QT vs Работа с указателями
Отправлено: Rcus от Январь 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


Название: Re: QT vs Работа с указателями
Отправлено: Tonal от Январь 11, 2009, 12:24
Классно!
Т.е. если данные не инициализировать, и вовсю запоминать указатели на локальные объекты, то естественно из за Qt всё и упадёт! :D

Похоже автор про инициализацию и объекты на стеке не в курсе. :(


Название: Re: QT vs Работа с указателями
Отправлено: Rcus от Январь 11, 2009, 13:00
Да ладно, когда я изучал C++ моей первой ошибкой было именно сохранение указателя на стековый объект (В языке Delphi нет стековых объектов, все в куче :))
Правда любой инструмент по контролю памяти такие ошибки ловит на раз (CodeGuard(BCB), Valgrind, BoundsChecker)