2016-09-25 2 views
0

Я работаю над внедрением алгоритма разделения и покоя, который находит две точки, наиболее близкие друг другу, и расстояние между ними. Мое окончательное решение находит правильный ответ (по сравнению с использованием грубой силы), но около 1/3 времени вернет ошибку ошибки сегментации. Я работаю над исправлением этой проблемы на пару дней, добавляя здесь заявления о печати, но не смог найти проблему. Я был бы признателен, если бы кто-то взглянул на мой код.Рекурсивная функция иногда возвращает ошибку сегментации

+0

Где ваш отладчик поставил ошибку сегментации? – Cedric

+0

Используя одни и те же данные ввода или разные данные каждый раз? У вас может быть нехватка стека, если функция рекурсивна. Попробуйте увеличить стек, повторно запустив данные, которые вызывают ошибку. – iksemyonov

+0

@Cedric просто попробовал отладчик, и он говорит, что ошибка сегментации происходит на 'for (j = i + 1; j Novice

ответ

2

Ваш цикл «разделить» предполагает, что X и Y имеют одинаковое количество элементов. Если Y имеет меньше X, вы столкнетесь с неопределенным поведением, которое может быть забавным результатом или сбоем.

+0

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

+0

Это имеет смысл. Я попытался разбить цикл на два: один для 'Y' с условием' i Novice

0

Попробуйте изменить способ доступа для векторов. Векторный индекс-оператор, похоже, имеет своеобразное поведение в некоторых компиляторах/платформах (по крайней мере, с моей точки зрения). Я думаю, проблема связана с тем, что он является связанным списком, что приводит к несмежному в памяти, но это всего лишь предположение. (EDIT: станд :: вектор является смежным в памяти, проблема в том, что-то еще) Попробуйте использовать итераторы вместо (простого Peasy с auto ключевым слова), такими как:

for (auto iter = Yprime.begin(); iter != Yprime.end(); iter++) { 
    // Your code here 
} 

Надеется, что это работает для вашего дела!

+0

Только что отредактировал мое сообщение об этом, увидел ваш комментарий после. Извини за это. Хотя, я прямо сказал ** «но это просто догадка» **. Поэтому вы ошибаетесь, говоря, что я совершенно не прав. Просто попробуйте, на LLVM я получаю ошибку сегментации для использования оператора индекса. – Cedric

+0

Спасибо за предложение. Мне потребовалось некоторое время, чтобы переопределить мой код таким образом. Тем не менее, я все еще получал ту же ошибку ... – Novice

+0

Извините, что ... У меня была аналогичная проблема один раз, и она решила ее ... В противном случае, единственное, что я вижу, это то, что выражение 'abs (Y [i ] .x - mid.x) Cedric

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