Использование указателей для доступа к элементам QVector - PullRequest
3 голосов
/ 13 января 2012

У меня проблемы с указателями и ссылками на двойники.

Я хочу получить доступ к элементам в QVector по именам.Вектор содержит двойные числа:

QVector<double> properties;
properties.append(28.0);
properties.append(1.0);
properties.append(44.0);
properties.append(0.001);

Теперь я создаю указатели на двойники:

double* Amplitude;
double* Frequency;
double* PhaseDifference;
double* Stepsize;

Эти указатели должны обеспечивать доступ к элементам моего вектора:

Amplitude = &properties[0];
Frequency = &properties[1];
PhaseDifference = &properties[2];
Stepsize = &properties[3];

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

Я пытался использовать больше записей в векторе, и в результате только два последних имели правильные значения.Что там происходит не так?

Я создаю и печатаю значения в конструкторе.Печать вектора дает правильные значения!

У кого-нибудь есть идея?

Ответы [ 4 ]

4 голосов
/ 13 января 2012

Ваши именованные указатели на самом деле итераторы . Итераторы могут быть недействительными . Например, всякий раз, когда вы изменяете размер вектора или вставляете что-либо в него и т. Д. Посмотрите точные правила аннулирования итератора для вашего конкретного типа вектора, в данном случае QVector и посмотрите, выполнили ли вы какой-либо из этих итераторов, аннулирующих операции перед печатью. Кстати, разыменование недействительного итератора может привести к неопределенному поведению.

3 голосов
/ 13 января 2012

Вы, должно быть, делаете что-то не так. Это работает:

#include <QVector>
#include <QDebug>

int main()
{
    QVector<double> v;
    v.append(2.0);
    v.append(18.4);

    double* val1 = &v[0];
    double* val2 = &v[1];

    qDebug() << *val1 << "\n" << *val2 << "\n";
}

Причины неправильной работы:

  • вектор перераспределен (изменен размер + перемещен в другую позицию в памяти)
  • элементы удалены из вектора.
  • вывод выполнен неправильно, или вы печатаете адреса памяти вместо значений.
2 голосов
/ 13 января 2012

Вы должны установить размер вектора при инициализации. Все будет хорошо, пока вы не измените их (push / pop), после этого значения в ваших указателях будут неопределенными.

1 голос
/ 13 января 2012

Существует вероятность того, что ваши указатели могли быть признаны недействительными между временем, когда вы их получили, и временем, когда вы фактически их использовали.добавив больше элементов, чем может вместить).

...