Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Firefox от Май 20, 2014, 13:07



Название: QVector push_back
Отправлено: Firefox от Май 20, 2014, 13:07
здравствуйте у меня вопрос про добавление в вектор значений. есть 2 структуры и такая организация:
Код:

strict First
{
int a;
int b;
};
struct mainST
{
QString A;
QVector <First> fst;
};
Заполняю их следующим образом
Код:
.h
QVector<mainST> mST;

 .cpp

for(int i=0;i<50;i++)
{
mainST currMainST;
currMainST.A=i;
First FF;
for(int j=0;j<30;j++)
{
FF.a=...
FF.b=...
currMainST.fst.push_back(FF);
}
mST.push_back(currMainST);
}
вместо добавления структур First последовательно в контейнер они затирают предыдущую, то есть в итоге размер QVector <First> fst; равен 1.


Название: Re: QVector push_back
Отправлено: OKTA от Май 20, 2014, 13:16
А как вот это должно работать?  ;D
currMainST.fst.at(i).push_back(FF);


Название: Re: QVector push_back
Отправлено: Firefox от Май 20, 2014, 13:19
ну я же в QVector< First> добавляю структуру First. как тогда правильно?


Название: Re: QVector push_back
Отправлено: OKTA от Май 20, 2014, 13:21
А у вас это компилируется?  ;D
Я думаю лучше писать так currMainST.fst.push_back(FF);


Название: Re: QVector push_back
Отправлено: Firefox от Май 20, 2014, 13:23
извините написано действительно так как вы написали, просто у меня в программе там большие структуры поэтому просто попыталась описать суть.


Название: Re: QVector push_back
Отправлено: OKTA от Май 20, 2014, 13:25
Ну, уж лучше привести код, как есть. Этот вполне рабочий..


Название: Re: QVector push_back
Отправлено: Firefox от Май 20, 2014, 13:44
хидер

Код:


struct impuls
{
 
    int NumberImpuls_ofParcels;
    float Parcels_ofImpuls;
    float LowerCarrierFrequency_ofImpuls;
    float TopCarrierFrequency_ofImpuls;
    float Duretion_ofImpuls;
    float TimeInterval_betweenImpuls;
    float RateCangeFrequency_ofImpuls;
    QString NumberPicture;
};


struct parsel
{
   
    float AverageFrequency_ofParcels;
    float Band_ofParcels;
    float Duration_ofParcels;
    int CountImpuls_ofParcels;
    QVector<impuls> imp;
    QString CarrierClass;

};

struct base_GLS
{
    QString TipGls;
    QVector<parsel> pars;
};
class read_BD : public QObject
{
    Q_OBJECT
public:
    explicit read_BD(QObject *parent = 0);

    QVector<base_GLS> base;
    QVector <QString> gls;
};
Код:
.cpp
int read_BD::load_data(QString fliename)
{
    QFile fp(fliename);
    if(!fp.open(QIODevice::ReadOnly))
        return 0;
    QString data;
    int count=0;

        data=fp.readAll();
        QStringList lst=data.split("\n");
        parseData(lst);

    qDebug()<<count;
    fp.close();
   
}

void read_BD::parseData(QStringList list)
{
    for(int i=1;i<list.size()-1;i++)
    {
        QStringList line=list.at(i).split(";");
        findGLS(line);
    }
    for(int j=0;j<gls.size();j++)
    {
        //лист строк по данному названию
        QStringList dataCurrentCel;
        qDebug()<<"list.size()"<<list.size();

        for(int i=1;i<list.size()-1;i++)
        {

           //выбираем последовательно все строки из базы относящиеся к данному названию
            if(list.at(i).contains(gls.at(j),Qt::CaseSensitive))
            {
                dataCurrentCel.push_back(list.at(i));
             

            }
        }

        base_GLS currBaseGls;
        currBaseGls.TipGls=gls.at(j);
   
     
        for(int k=0;k<dataCurrentCel.size();k++)
        {
             //разбиваем строку на столбцы со значениями
            QStringList line=dataCurrentCel.at(k).split(";");
            QStringList lineNext;
            if(k==150)
            {
                int yy=0;
            }
            if(k<dataCurrentCel.size()-1)
            {
                lineNext<<dataCurrentCel.at(k+1).split(";");
            }
            qDebug()<<"line"<<line;
            qDebug()<<"lineNext"<<lineNext;
            parsel curr_par;
           if(control_item(line.at(3))>0 || control_item(line.at(3))==-1.f)
           {
               
                curr_par.CountImpuls_ofParcels=control_item(line.at(3));
               
                curr_par.AverageFrequency_ofParcels=control_item(line.at(0))*1000.f;
             
                curr_par.Band_ofParcels=control_item(line.at(1));
               
                curr_par.Duration_ofParcels=control_item(line.at(2));
               
                curr_par.CarrierClass=line.at(12);

            }
             

                if(control_number_impuls(list.at(4))>0)
                {
                     for(int t=1;t<control_number_impuls(list.at(4));t++)
                    {
                          impuls ii;
                         
                          ii.NumberImpuls_ofParcels=t;
                         
                          ii.Parcels_ofImpuls=control_item(line.at(5));
                           
                          ii.LowerCarrierFrequency_ofImpuls=control_item(line.at(6))*1000.f;
                         
                          ii.TopCarrierFrequency_ofImpuls=control_item(line.at(7))*1000.f;
                         
                          ii.Duretion_ofImpuls=control_item(line.at(8));
                         
                          ii.TimeInterval_betweenImpuls=control_item(line.at(9));
                         
                          ii.RateCangeFrequency_ofImpuls=control_item(line.at(10));;
                         
                          ii.NumberPicture=line.at(11);
                          curr_par.imp.append(ii); // ПРОБЛЕМА ИМЕННО ПРИ ДОБАВЛЕНИИ ДАННОЙ СТРУКТУРЫ
                          qDebug()<<curr_par.imp.size();
                     }
                }
                else if(control_number_impuls(list.at(4))==0)
                {
                    impuls ii;
                   
                    ii.NumberImpuls_ofParcels=control_item(line.at(4)); ;
                   
                    ii.Parcels_ofImpuls=control_item(line.at(5));
                   
                    ii.LowerCarrierFrequency_ofImpuls=control_item(line.at(6))*1000.f;
                   
                    ii.TopCarrierFrequency_ofImpuls=control_item(line.at(7))*1000.f;
                   
                    ii.Duretion_ofImpuls=control_item(line.at(8));
                   
                    ii.TimeInterval_betweenImpuls=control_item(line.at(9));
                   
                    ii.RateCangeFrequency_ofImpuls=control_item(line.at(10));;
                   
                    ii.NumberPicture=line.at(11);
                   
                    curr_par.imp.push_back(ii); // ПРОБЛЕМА ИМЕННО ПРИ ДОБАВЛЕНИИ ДАННОЙ СТРУКТУРЫ
                    qDebug()<<curr_par.imp.size();
                }
                else
                {
                  ;
                }

               if(k==dataCurrentCel.size()-1)
                   currBaseGls.pars.push_back(curr_par);
               else if(k< dataCurrentCel.size()-1 && (control_item(lineNext.at(3))>0 || control_item(lineNext.at(3))==-1.f))
                {
                   qDebug()<<"urr_par.imp.size()"<<curr_par.imp.size();
                   currBaseGls.pars.push_back(curr_par);
                }

        }
        base.push_back(currBaseGls);
    }

}


Название: Re: QVector push_back
Отправлено: OKTA от Май 20, 2014, 14:14
А вы проверяли, сколько раз программа заходит в эти условия, где должен добавляться элемент?


Название: Re: QVector push_back
Отправлено: Firefox от Май 20, 2014, 14:24
проверяла программа точно заходит туда. я ставила точку останова прямо на добавление.


Название: Re: QVector push_back
Отправлено: OKTA от Май 20, 2014, 14:41
а сколько раз заходит?


Название: Re: QVector push_back
Отправлено: Firefox от Май 20, 2014, 15:10
там по названию сортируется, по первому названию 8 структур заполняется вот 8 раз и заходит, потом дальше по разному


Название: Re: QVector push_back
Отправлено: Firefox от Май 20, 2014, 15:11
заходит в это условие:  else if(control_number_impuls(list.at(4))==0)


Название: Re: QVector push_back
Отправлено: Igors от Май 20, 2014, 15:22
По ходу дела
Код:
strict First
{
int a;
int b;
};
Есть малюсенький но очень полезный класс QPair (или std::pair). Напр тогда вместо
Код:
FF.a=a;
FF.b=b;
currMainST.fst.push_back(FF);
можно с комфортом записвть
Код
C++ (Qt)
currMainST.fst.push_back(QPair(a, b));
 
И присваивание дописывать не придется, и оператор < (сделано, пользуйтесь)


Название: Re: QVector push_back
Отправлено: Firefox от Май 20, 2014, 15:49
это был пример организации, ниже приведен реальный код и там более 2-х составляющих в структурах.


Название: Re: QVector push_back
Отправлено: OKTA от Май 20, 2014, 16:02
если он 8 раз заходит, то 8 раз и добавляет, вектор не может чудить)) Вы же в дебаггере смотрели, что он показывает в содержимом вектора на каждой итерации?


Название: Re: QVector push_back
Отправлено: Firefox от Май 20, 2014, 16:13
yнашла ошибку. он действительно все хорошо добавляет, проблема была в том что экземпляр структуры curr_par создан внутри цикла, потому при выходе из цикла структура очищалась


Название: Re: QVector push_back
Отправлено: Firefox от Май 26, 2014, 11:19
Не хочу создавать новую тему, спрошу здесь ещё один вопрос. У меня проблема с русским текстом. работаю в МСВС. осуществляю выборку по названию из QStringList строк в которых встречается данное название. Все хорошо если в названии есть цифра или латинские буквы. когда название русскими буквами, выбирает все подряд лишь бы по числу символов одинаково было. Пересохраняла файл из которого читаю в UTF-8, KOI8-R.
Код:
QStringList list;
QVector<QString> gls;
/* заполнение gls, list*/
.....
 
for(int j=0;j<gls.size();j++)
    {
        //лист строк по данному названию
        QStringList dataCurrent;
        for(int i=1;i<list.size()-1;i++)
        {

           //выбираем последовательно все строки из базы относящиеся к данному названию
            if(list.at(i).contains(gls.at(j),Qt::CaseSensitive)) // ВОТ ТУТ НЕ СРАБАТЫВАЕТ РУССКИЙ
            {
                dataCurrent.push_back(list.at(i));
            }
          //...
          }
        }
пробовала так
Код:
QTextCodec *cdc=QTextCodec::codecForName("UTF-8");//KOI8-R
...
for(int j=0;j<gls.size();j++)
    {
        //лист строк по данному названию
        QStringList dataCurrent;
        for(int i=1;i<list.size()-1;i++)
        {
           QStringList ggg=list.at(i).split(";");
           //выбираем последовательно все строки из базы относящиеся к данному названию
            if(cdc->fromUnicode(ggg.at(13).toAscii())==cdc->fromUnicode(gls.at(j).toAscii())) // ВОТ ТУТ НЕ СРАБАТЫВАЕТ РУССКИЙ
            {
                dataCurrent.push_back(list.at(i));
            }
          //...
          }
подскажите. как правильно сравнить строки с русским текстом?


Название: Re: QVector push_back
Отправлено: Hellraiser от Май 26, 2014, 12:04
QString::toLocal8Bit()


Название: Re: QVector push_back
Отправлено: Firefox от Май 26, 2014, 13:09
не сработало


Название: Re: QVector push_back
Отправлено: Firefox от Май 26, 2014, 14:53
Прошу прощение за беспокойство. проблема решилась сама собой, перекодировкой файла из которого я читаю. перекодировала в Unicode а потом в UTF-8 обратно и все заработало.