У вас наверняка есть ошибки в вашем коде. Трудно иметь дело с кодом без входных данных, который вызвал ошибку, но давайте попробуем:
- Во-первых, давайте посмотрим на функцию
Point getmeans(vector<Point> points)
предполагается оценить средние координаты для кластера точек: если вы передадите пустой кластер этой функции, это вызовет ошибку:
смотри здесь -
int M=points.size()
и здесь -
for(i=0;i<M;i++)
{
sumX=points[i].X;
sumY=points[i].Y;
}
если ваш кластер пуст, чем M
будет равен нулю, и ваш цикл будет повторяться 2 ^ 31 раз (до 32-разрядного целочисленного переполнения), и каждый раз вы будете пытаться прочитать значения несуществующих векторных элементов
Итак, вы должны проверить, не является ли ваш вектор не пустым, перед запуском цикла основной функции, и вы должны решить, какие средние значения следует назначить для нулевого кластера (может быть, вам нужен дополнительный флаг для пустого кластера, который будет проверен перед имея в виду средние значения кластера)
- Затем рассмотрим функцию
int getmindis(Point p,Point means[])
, а также место, где мы ее называем:
index=getmindis(points[i],means); clusters[index].push_back(points[i]);
Эта функция указывает на кластеры. номер кластера определяется переменной c
. Если входная точка не подходит ни к одному кластеру, функция вернет неинициализированную переменную (содержащую любое возможное значение), которая. затем используется как векторный индекс несуществующего элемента - возможное нарушение прав доступа
Вы, вероятно, должны инициализировать c
в ноль в объявлении
Сообщите нам, когда вы будете готовы к ошибкам, описанным выше, а также покажите нам пример входного файла (тот, который вызывает ошибки, если все наборы данных вызывают ошибки, покажите нам самый маленький файл)