Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Firefox от Декабрь 24, 2012, 11:29



Название: QVector
Отправлено: Firefox от Декабрь 24, 2012, 11:29
здравствуйте. подскажите как правильно записать данные в QVector. Есть структура
Код:
typedef struct
{
        short int leftAngle;
        unsigned short int leftValue;
        short int rightAngle;
        unsigned short int rightValue;
} MBESValueData;

... //далее в коде есть
 QVector<MBESValueData> *data;  // без итераторов именно в таком виде используется(программа не моя мне надо устранить ошибки,а такой вид контейнера далее везде возвращают функции)
как мне заполнить этот вектор данными правильно.
пыталась вот так
Код:
data->at(j).leftAngle=0;
 MBESValueData signal;
data.append(signal);
но компилятор не принимает.
подскажите пожалуйста.


Название: Re: QVector
Отправлено: Пантер от Декабрь 24, 2012, 11:31
data->append(signal);


Название: Re: QVector
Отправлено: kambala от Декабрь 24, 2012, 11:34
ты в блокноте что ли пишешь? нормальная среда разработки автоматически вставляет точку или стрелочку в зависимости от того, является ли переменная указателем или нет.


Название: Re: QVector
Отправлено: Firefox от Декабрь 24, 2012, 11:35
я так пробовала.ругается. про точку просто описалась.  так же пробовала data->push_back(signal);
пишет что-то вроде нельзя обратиться данным структуры которые предназначены только для чтения.


Название: Re: QVector
Отправлено: Firefox от Декабрь 24, 2012, 11:36
нет пишу не в блокноте))просто на машине с мсвсом нет интернета, а под виндовсом есть. вот и написала эти сточки от руки.


Название: Re: QVector
Отправлено: Пантер от Декабрь 24, 2012, 11:37
Давай больше кода.


Название: Re: QVector
Отправлено: Firefox от Декабрь 24, 2012, 11:38
принимает при компиляции вот такой вариант
(*data)[j].leftAngle=  (short int)(sin_angle_norm * 32768.f);
 но вылетает в брейк программа на этой строке.


Название: Re: QVector
Отправлено: mutineer от Декабрь 24, 2012, 11:40
Очень пригодится конкретный текст ошибок, которые выдает компилятор


Название: Re: QVector
Отправлено: Firefox от Декабрь 24, 2012, 11:42
Код:
структура находиться в подключаемом файле
// пример функции где она испльзуется
void model_mle::imit_test_line_profil(float depth, unsigned int scale , QVector<MBESValueData> *pac_udp_data[4],QByteArray *pac[4] )
{

    // рТБЧЙМП ДМС ЪОБЛПЧ Х ХЗМПЧ:
    // ХЗМЩ ПФУЮЙФЩЧБАФУС ПФ ОПТНБМЙ Л БОФЕООЕ
    // ЪОБЛ НЙОХУ "-"  ДМС ХЗМПЧ ПФУЮЙФЩЧБЕНЩИ РП ЮБУПЧПК УФТЕМЛЕ
    // РМАУ "+" ДМС ХЗМПЧ РТПФЙЧ ЮБУПЧПК УФТЕМЛЙ
   // float angle_left_antenna = 60.f;
   // float angle_right_antenna = 120.f;
   // оБ ЫЛБМЕ 300Н ДМС ХЗМБ 15ЗТБД ЙНЕЕН ОБЛМПООХА ДБМШОПУФШ 311Н
    // тБЪОЙГБ (311-300Н)/SD=333 ПФУЮЕФБ РП ДБМШОПУФЙ
    float x;     // РМПУЛБС ДЙУФБОГЙС
    float dist;  // ОБЛМПООБС ДЙУФБОГЙС
    float sin_angle;
    float angle; // ХЗПМ ПФУЮЙФЩЧБЕНЩК ПФ ЧЕТФЙЛБМЙ
    float angle0; // ХЗПМ ПФУЮЙФЩЧБЕНЩК ПФ ОПТНБМЙ Л БОФЕООЕ
    float sin_angle_norm;
    float dr;     // ЫБЗ РП ДЙУФБОГЙЙ
    int j0;
    QVector<MBESValueData> *data;
    MBESValueData signal;
    unsigned short int size_pac[]={ 864, 2400, 4064, 4064 };
    int sz=size_pac[scale];
    DEBMESSAGE( JUNK, ("model_mle: start  imit_test_line_profil "));

    pac[0]->resize(256+sz*8); // ПЮЙЭБЕН ЧУЕ 4 ДБФБЗТБННЩ ?
    pac[1]->resize(256+sz*8);
    pac[2]->resize(256+sz*8);
    pac[3]->resize(256+sz*8);

    DEBMESSAGE( JUNK, ("model_mle: imit_test_line_profil ----->ok1a "));


    j0=(int)(depth/SD);
    for(int j=0; j<j0;  j++)
    {
      // это работает нормально
       data=setMBESValueDatagramm(j,scale,pac_udp_data);// функция возвращает QVector<MBESValueData>*

        signal.leftAngle= 0;
        signal.leftValue= 0;
        signal.rightAngle=0;
        signal.rightValue=0;
// далее пытаюсь записать signal в data
  }
....
}


Название: Re: QVector
Отправлено: Пантер от Декабрь 24, 2012, 11:48
Нельзя же так жестоко в понедельник... Такое ощущение, что все части Пилы увидел в одном посте. :(


Название: Re: QVector
Отправлено: Firefox от Декабрь 24, 2012, 11:54
неужели совсем все так плохо...


Название: Re: QVector
Отправлено: kuzulis от Декабрь 24, 2012, 11:57
Цитировать
ты в блокноте что ли пишешь? нормальная среда разработки автоматически вставляет точку или стрелочку в зависимости от того, является ли переменная указателем или нет.

Значит VS - не нормальная среда! :)


Название: Re: QVector
Отправлено: Igors от Декабрь 24, 2012, 11:57
QVector::at объявлен как константный, т.е. компилятор говорит правильно. Надо использовать (*data)[j], как Вы и сделали (ну или объявить ссылку чтобы не таскать все время звездочку). Однако судя по приведенному коду индекc j у Ввс явно "от фонаря"
Код:
    for(int j=0; j<j0;  j++)
    {
      // это работает нормально
       data=setMBESValueDatagramm(j,scale,pac_udp_data);// функция возвращает QVector<MBESValueData>*

        signal.leftAngle= 0;
        signal.leftValue= 0;
        signal.rightAngle=0;
        signal.rightValue=0;
// далее пытаюсь записать signal в data
  }
....
}
На каждой итерации Вы получаете указатель на вектор (массив), и пишете что-то в его j-й элемент, никак не заботясь об остальных - это может иметь смысл только если возвращаемый вектор тот же самый.

неужели совсем все так плохо...
Ну.. пока не очень хорошо  :)


Название: Re: QVector
Отправлено: Firefox от Декабрь 24, 2012, 12:26
а можно поподробнее. я хочу последовательно следовать от 0 элемента вектора и по нарастающей. j у меня в цикле от 0 и  идет. как мне тогда например позаботиться об остальных элементах??


Название: Re: QVector
Отправлено: Igors от Декабрь 24, 2012, 12:45
а можно поподробнее. я хочу последовательно следовать от 0 элемента вектора и по нарастающей. j у меня в цикле от 0 и  идет. как мне тогда например позаботиться об остальных элементах??
Так я ж не знаю как и что Вы хотите заполнять. Напр setMBESValueDatagramm каждый раз создает новый вектор который нужно заполнить, или вектор один и тот же? И кто задает число элементов в векторе?  Если просто вектор с начальными значениями, то лучше так

Код
C++ (Qt)
struct MBESValueData
{
// нужен конструктор по умолчанию
       MBESValueData( void ) : leftAngle(0), leftValue(0), rightAngle(0), rightValue(0) {}
 
       short int leftAngle;
       unsigned short int leftValue;
       short int rightAngle;
       unsigned short int rightValue;
};
Тогда создать или заполнить можно 1 вызовом
Код
C++ (Qt)
data = new QVector<MBESValueData>(10);  // 10 элементов (с нулями)
data->resize(20);  // теперь 20