Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Martiro от Апрель 11, 2013, 14:52



Название: Непонятки с QVector
Отправлено: Martiro от Апрель 11, 2013, 14:52
Есть структуры:
Код
C++ (Qt)
struct LayerInfo
{
QVector<VectorisedPolyLine> m_Polygons;
QVector<VectorisedPolyLine> m_PolyLines;
QVector<smallPoint> m_Points;
};
 
struct VectorisedPolyLine
{
QVector<smallPoint> m_Points;
int iColor;
float Hrel;
float Habs;
};
struct smallPoint
{
double m_B;
double m_L;
double m_H;
int iColor;
};

Пытаюсь заполнять структуры:
Код
C++ (Qt)
          LayerInfo LIResult;
          VectorisedPolyLine vPolyLine;
          for (int j = 1; j <= iPointCount; j++)
          {
              smallPoint spCur;
              spCur.m_B = mapXPlane(curObj, j, 0);
              spCur.m_L = mapYPlane(curObj, j, 0);
 
              if (vPolyLine.m_Points.resize(j+1))
              vPolyLine.m_Points.insert(j-1,&spCur);
 
          }
          if ( LIResult.m_PolyLines.resize((int)LIResult.m_PolyLines.count()+1))
          { LIResult.m_PolyLines.insert((int)LIResult.m_PolyLines.count()-1,&vPolyLine); continue;}
          else {return -1;}

В итоге, в месте где:
Код
C++ (Qt)
vPolyLine.m_Points.resize(j+1)
всё проходит нормально, а в месте
Код
C++ (Qt)
if ( LIResult.m_PolyLines.resize((int)LIResult.m_PolyLines.count()+1))
   { LIResult.m_PolyLines.insert((int)LIResult.m_PolyLines.count()-1,&vPolyLine); continue;}
    else {return -1;}
в процессе исполнения консоль пишет:
QGVector::insert: Index -1 out of range
Почему так? Ведь условие проходит? Или я неправильно задаю новое количество элементов в векторе?


Название: Re: Непонятки с QVector
Отправлено: Bepec от Апрель 11, 2013, 14:57
Тебе прямым текстом написали :D

Что у тебя происходит обращение к элементу вектора "-1".


Название: Re: Непонятки с QVector
Отправлено: Martiro от Апрель 11, 2013, 15:05
Читать-то я умею. :)
Я не понимаю, почему он пытается обратиться к элементу с индексом "-1"?
Ведь после выполнения ресайза, каунт должен измениться на единицу и тогда, при первой итерации, он должен обращаться к "нулевому" ("0") элементу! А он вообще ресайз не выполняет, в отличае от случая с "vPolyLine.m_Points.resize(j+1)"!


Название: Re: Непонятки с QVector
Отправлено: kambala от Апрель 12, 2013, 00:22
зачем делать ресайз на каждой итерации? можно просто push_back()


Название: Re: Непонятки с QVector
Отправлено: Martiro от Апрель 12, 2013, 08:13
Не собирает. Говорит:
no matching function for call to 'QPtrVector<smallVector>push_back(smallPoint)'
Этож QVector, а не vector...


Название: Re: Непонятки с QVector
Отправлено: Bepec от Апрель 12, 2013, 08:15
То, что QVector имеет все методы stl, вас не смущает? Должно собираться.


Название: Re: Непонятки с QVector
Отправлено: Martiro от Апрель 12, 2013, 08:39
Собиратся должно было, если бы это был QT4. А у меня третий.


Название: Re: Непонятки с QVector
Отправлено: Igors от Апрель 12, 2013, 08:59
Не собирает. Говорит:
no matching function for call to 'QPtrVector<smallVector>push_back(smallPoint)'
Этож QVector, а не vector...
Ну видимо правильно говорит - не может привести smallPoint к smallVector. В любом случае resize уберите, они здесь совсем не нужны


Название: Re: Непонятки с QVector
Отправлено: Martiro от Апрель 12, 2013, 09:08
Это опечатка. Машинально набрал отруки. Там везде smallPoint.
Разве я могу делать инсерт, без предварительного ресайза. Я ведь изначально создаю кувектор с нулевым количеством указателей.


Название: Re: Непонятки с QVector
Отправлено: Old от Апрель 12, 2013, 09:24
Разве я могу делать инсерт, без предварительного ресайза. Я ведь изначально создаю кувектор с нулевым количеством указателей.
Конечно можете, а вот по индексу установить через [] нет.


Название: Re: Непонятки с QVector
Отправлено: Bepec от Апрель 12, 2013, 09:25
Вы уточните какой у вас Qt. А то в третьем вообще нету QVector как бы :D

(http://img0.joyreactor.cc/images/thumbnail/templates/solo/seriously_m.png)


Название: Re: Непонятки с QVector
Отправлено: Martiro от Апрель 12, 2013, 09:32
The QVector class has been renamed QPtrVector in Qt 3.0
Так что он как бы есть.


Название: Re: Непонятки с QVector
Отправлено: Bepec от Апрель 12, 2013, 09:57
Не тормозите, уважаемый. Если у вас в коде имеется тяпдефы, приводите их.

А то вы не даёте никакой информации, приводите код использующий классы из следующих версий Qt.

PS мб вы ещё что-нить скрываете ?

PPS уточните всё же версию Qt. Просто тройка, али ещё какая? (3.3? 3.1? 3.0?)

И вроде бы QValueVector является STL реализацией вектора в тройке. Он вам не подойдёт?


Название: Re: Непонятки с QVector
Отправлено: Martiro от Апрель 12, 2013, 10:15
Прошу прощения за то, что сразу все не написал. Просто сам не сразу разобрался в чем дело. Думал от QVector ушли на стадии перехода от версии Qt2 к Qt3. А как оказалось, его потом вернули в версии Qt4, причем со всеми функциями СИшного vector.
Собирал все под Qt3.3.8. Использовать QValueVector нельзя (прописано в ТЗ).
Сейчас буду общатся с заказчиком по поводу использования 4-й версии Qt.


Название: Re: Непонятки с QVector
Отправлено: Bepec от Апрель 12, 2013, 10:24
typedef QValueVector QVector; ?

PS но это плохо, когда заказчик лезет в самый самый код по ТЗ. ;)


Название: Re: Непонятки с QVector
Отправлено: Martiro от Апрель 12, 2013, 10:31
Есть общий h-ник со структурами, под который исполнители создают различные функции.
Вопрос снят. Договорился насчет 4-й версии, убедил.
Но причина обращения к "-1" элементу мне так и не ясна. :)


Название: Re: Непонятки с QVector
Отправлено: kambala от Апрель 12, 2013, 12:20
дебагом что ли не смотрел?


Название: Re: Непонятки с QVector
Отправлено: Martiro от Апрель 12, 2013, 16:43
Писать и отлаживать приходится под виртуалкой (мсвс). Там отладчики либо работают криво, либо вообще не работают.


Название: Re: Непонятки с QVector
Отправлено: Alex Custov от Апрель 12, 2013, 16:44
printf никто не отменял же


Название: Re: Непонятки с QVector
Отправлено: Martiro от Апрель 12, 2013, 17:16
Я в курсе. А еще есть qDebug. Вот ими-то, увы, и приходится пльзоваться.
По qDebug условие resize проходит, а insert не срабатывает. Получается, что размер никогда  не меняется, хотя во второй "if(... .resize() )" входит, говорит, что "true", а размер не изменяет.


Название: Re: Непонятки с QVector
Отправлено: Old от Апрель 12, 2013, 17:22
Получается, что размер никогда  не меняется, хотя во второй "if(... .resize() )" входит, говорит, что "true", а размер не изменяет.
А в Qt3 resize что-то возвращает? В Qt4 и Qt5 - void.


Название: Re: Непонятки с QVector
Отправлено: Martiro от Апрель 12, 2013, 17:35
а там bool. :)


Название: Re: Непонятки с QVector
Отправлено: andrek от Апрель 16, 2013, 16:18
есть проблема заюзать std::vector ?