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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Непонятки с QVector  (Прочитано 8305 раз)
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
Почему так? Ведь условие проходит? Или я неправильно задаю новое количество элементов в векторе?
Записан
Bepec
Гость
« Ответ #1 : Апрель 11, 2013, 14:57 »

Тебе прямым текстом написали Веселый

Что у тебя происходит обращение к элементу вектора "-1".
Записан
Martiro
Гость
« Ответ #2 : Апрель 11, 2013, 15:05 »

Читать-то я умею. Улыбающийся
Я не понимаю, почему он пытается обратиться к элементу с индексом "-1"?
Ведь после выполнения ресайза, каунт должен измениться на единицу и тогда, при первой итерации, он должен обращаться к "нулевому" ("0") элементу! А он вообще ресайз не выполняет, в отличае от случая с "vPolyLine.m_Points.resize(j+1)"!
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Апрель 12, 2013, 00:22 »

зачем делать ресайз на каждой итерации? можно просто push_back()
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Martiro
Гость
« Ответ #4 : Апрель 12, 2013, 08:13 »

Не собирает. Говорит:
no matching function for call to 'QPtrVector<smallVector>push_back(smallPoint)'
Этож QVector, а не vector...
Записан
Bepec
Гость
« Ответ #5 : Апрель 12, 2013, 08:15 »

То, что QVector имеет все методы stl, вас не смущает? Должно собираться.
Записан
Martiro
Гость
« Ответ #6 : Апрель 12, 2013, 08:39 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Апрель 12, 2013, 08:59 »

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

Это опечатка. Машинально набрал отруки. Там везде smallPoint.
Разве я могу делать инсерт, без предварительного ресайза. Я ведь изначально создаю кувектор с нулевым количеством указателей.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Апрель 12, 2013, 09:24 »

Разве я могу делать инсерт, без предварительного ресайза. Я ведь изначально создаю кувектор с нулевым количеством указателей.
Конечно можете, а вот по индексу установить через [] нет.
Записан
Bepec
Гость
« Ответ #10 : Апрель 12, 2013, 09:25 »

Вы уточните какой у вас Qt. А то в третьем вообще нету QVector как бы Веселый

Записан
Martiro
Гость
« Ответ #11 : Апрель 12, 2013, 09:32 »

The QVector class has been renamed QPtrVector in Qt 3.0
Так что он как бы есть.
Записан
Bepec
Гость
« Ответ #12 : Апрель 12, 2013, 09:57 »

Не тормозите, уважаемый. Если у вас в коде имеется тяпдефы, приводите их.

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

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

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

И вроде бы QValueVector является STL реализацией вектора в тройке. Он вам не подойдёт?
« Последнее редактирование: Апрель 12, 2013, 10:03 от Bepec » Записан
Martiro
Гость
« Ответ #13 : Апрель 12, 2013, 10:15 »

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

typedef QValueVector QVector; ?

PS но это плохо, когда заказчик лезет в самый самый код по ТЗ. Подмигивающий
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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