2014-01-05 3 views
0

1) Я хочу передать указатель QVector функции, а затем делать с ней что-то. Я попытался это:Передача указателя QVector как аргумента

void MainWindow::createLinearVector(QVector<float> *vector, float min, float max) 
{ 
    float elementDiff=(max-min)/(vector->size()-1); 

    if(max>min) min -= elementDiff; 
    else  min += elementDiff; 

    for(int i=0; i< vector->size()+1 ; i++) 
    { 
     min += elementDiff; 
     *(vector+i) = min; //Problematic line 
    } 

} 

Однако компилятор дает мне «не подходит для оператора =» для *(vector+i) = min; линии. Каким может быть лучший способ выполнить такие действия на QVector?

2) Функция должна линейно распределять значения для вектора для графика, как работает оператор matlab:, например vector (a: b: c). Каков самый простой и лучший способ выполнить такие вещи в Qt?

EDIT:

С помощью здесь исходная задача решена. :)

Я также улучшил метод в себе. Точность может быть значительно улучшена за счет использования линейной интерполяции вместо нескольких дополнений, как указано выше. При многократном добавлении происходит накопление ошибки, что в значительной степени устраняется линейной интерполяцией.

Btw, оператор if в первой функции был ненужным и можно удалить, просто переставив материал немного даже в метод множественного добавления.

void MainWindow::createLinearVector(QVector<double> &vector, double min, double max) 
{ 
    double range = max-min; 
    double n = vector.size(); 

    vector[0]=min; 

    for(int i=1; i< n ; i++) 
    { 
     vector[i] = min+ i/(n-1)*range; 
    } 
} 

Я рассмотрел возможность использования какой-то зачарованной петли для этого, но было бы более практичным? С помощью, например, цикла foreach, мне все равно придется увеличивать некоторую переменную для правильной интерполяции? А также сделать условие для пропуска первого элемента?

+0

Вы пытаетесь присвоить 'float'' QVector'. Это не разрешено, но действительно ли это то, что вы хотите сделать? – juanchopanza

+1

Я хочу разместить поплавок в определенном месте в QVector. Это разрешено оператором [], но не тогда, когда «вектор» является указателем. Я также попытался пройти по ссылке. Тогда [] был в порядке, но вместо этого вызов от & myVector не был разрешен. – user3050215

+0

Затем не передавайте указатель. Или спросите, как вызвать перегруженных операторов из указателей. – juanchopanza

ответ

1

Я думаю, первый и нужно использовать изменяемый итератор для этого материала: Qt doc link

Что-то вроде этого:

QMutableVectorIterator<float> i(vector); 
i.toBack(); 
while (i.hasPrevious()) 
    qDebug() << i.{your code} 
+0

Это интересно! Однако, наверное, не нужно? «Альтернативой использованию итераторов является использование указательных позиций. Большинство функций-членов QVector принимают индекс в качестве своего первого параметра, что позволяет получать, вставлять и удалять элементы без использования итераторов». http://harmattan-dev.nokia.com/docs/library/html/qt4/qmutablevectoriterator.html – user3050215

+0

Вы всегда должны отбирать итераторы для индексов, потому что они предотвращают ошибки «один за другим». –

+1

@SimonWarta: IMO, итератор здесь - лишний излишний. – lpapp

3

Я хочу, чтобы поместить поплавок определенное место в QVector.

Затем используйте:

(*vector)[i] = min; //Problematic line 

Вектор представляет собой указатель на QVector, *vector будет QVector, который может быть indiced с [i] как любой QVector. Однако, из-за приоритета, нужны скобки для правильного порядка операций.

+0

IMO, используя foreach, было бы более естественным в программном обеспечении Qt с контейнерами Qt, и в этом случае индексация больше не вызывает беспокойства. :-) – lpapp

+0

Это, вероятно, так, потому что петли - это гадзь. Тем не менее, гибкость предоставляется. – user3050215

+0

@ user3050215: какая гибкость необходима для вашего кода? Foreach делает большую работу Qt'ish для этой задачи IMO. Он также отклоняет озабоченность по поводу индексации. :-) – lpapp

1

Правильно, поэтому здесь нет смысла использовать указатель QVector. Таковы причины:

  • Используя ссылку для параметра метода должен быть более C++ 'иш, если неявное совместное использование не достаточно быстро для вас.

  • Несмотря на то, что в большинстве случаев вам даже не нужна ссылка, просто передавая аргументы, не возвращая результат в тот же аргумент (т. Е. Выходной аргумент). Это потому, что * QVector - implicitly shared, и копия происходит только для записи в соответствии с документацией. К счастью, синтаксис будет одинаковым для вызова и внутренней реализации метода в обоих случаях, поэтому легко перейти от одного к другому.

  • Использование интеллектуальных указателей предпочтительнее вместо необработанных указателей, но здесь, по моему мнению, здесь нет необходимости в сложных решениях.

Итак, я хотел бы предложить, чтобы реорганизовать свой код в этом:

void MainWindow::createLinearVector(QVector<float> &vector, float min, float max) 
{ 
    float elementDiff = (max-min)/(vector.size()-1); 

    min += ((max>min) ? (-elementDiff) : elementDiff) 

    foreach (float f, vector) { 
     min += elementDiff; 
     f = min; 
    } 
} 

Обратите внимание, что я устроились следующие вещи в вашем коде:

  • ссылочный параметр типа в отличие до указателя

  • "->" разрешение участника на "." соответственно

  • троичной операции вместо неестественно, если/иначе в этом случае

  • Еогеаспа Qt вместо индексации низкого уровня в этом случае исходная точка становится спорным

Это то, как вы должны вызывать метод от вызывающего:

createLinearVector(vector, fmin, fmax); 
+0

здесь нет ссылки на QVector, поэтому любые обновления к вектору теряются (что не то, что он хочет) –

+0

@ratchetfreak: спасибо, это была опечатка, исправлена. – lpapp

+0

Спасибо! Вероятно, мне следовало бы изучить альтернативные варианты чередования циклов, поскольку я использую только альтернативы в низкоуровневом встроенном программировании. Что касается тройной операции, я не знаю.Не похоже, что он делает код более читабельным и быстрым, но, может быть, лучше привыкнуть к нему. Я понял, что есть еще один способ сделать то, что я намеревался, разместил его в теме. – user3050215

Смежные вопросы