Вектор:: стереть ошибку сегментации

У меня есть ошибка сегментации в этом коде, и я не могу понять, почему:

vector <double> *point;
for (int i = 0; i < point->size(); i += 3) {
    for (int j = i + 3; j < point->size(); j += 3) {
        if (distance((*point)[i], (*point)[i + 1],(*point)[i + 2], (*point)[j],(*point)[j + 1], (*point)[j + 2]) < treshold){
             point->erase(point->begin() + j, point->begin() + j * 3);
             j -= 3;
        }
    }
}

точка — это вектор координат точек, что-то вроде (x1,y1,z1,x2,y2,z3,...,xn,yn,zn). Расстояние — это функция, которая вычисляет евклидово расстояние между двумя точками с учетом координаты 6. По сути, я бы сделал что-то вроде «если две точки расположены слишком близко друг к другу, удалите одну из них». Но я получаю ошибку сегментации. Есть идеи?


person user1544128    schedule 05.09.2012    source источник
comment
Нет, point — это не вектор, это указатель на вектор. На что это указывает?   -  person Konrad Rudolph    schedule 05.09.2012
comment
Где именно в этом коде возникает ошибка сегментации?   -  person Timo Geusch    schedule 05.09.2012
comment
почему каждая серия из 3 doubles считается одним очком? Почему у вас нет vector из coordinate, где каждая coordinate содержит 3 сомнения?   -  person Mooing Duck    schedule 05.09.2012
comment
Прости, мой плохой. Указатель на вектор, который он инициализировал, это просто фрагмент моего кода. На самом деле, если я сделаю вырез размера перед этим циклом, он сработает. И причина, по которой я использую вектор двойной точности вместо одной из координат, заключается в том, что используемая мной библиотека требует вектор двойной точности.   -  person user1544128    schedule 05.09.2012


Ответы (2)


Строка erase неверна. У вас есть j * 3, когда вы, вероятно, имеете в виду j + 3.

person Brangdon    schedule 05.09.2012

vector <double> *point;

объявляет неинициализированный указатель, к которому вы пытаетесь получить доступ с помощью point->size().

Таким образом, неопределенное поведение и сбой.

Вместо этого я бы выбрал простой объект

vector <double> point;

или, если вы должны использовать динамическую память:

vector <double> *point = new vector<double>;
person Luchian Grigore    schedule 05.09.2012
comment
Я бы предположил, что это действительно инициализировано, или он, вероятно, заметил бы, и что ответ Брэнгдона - настоящая проблема. - person Mooing Duck; 05.09.2012
comment
@MooingDuck Признаюсь, я не заглядывал так далеко :) - person Luchian Grigore; 05.09.2012