2014-08-27 4 views
2

Я изучаю C++ и пытаюсь решить проблемы в программировании. Я застрял в решении веселой перемычки. Чтобы добраться до точки, моя программа запускается, но после ввода первой строки и получения вывода возникает ошибка сегментации. Вот мой код:Ошибка ошибки сегментации C++

#include <iostream> 
    #include <cmath> 

    using namespace std; 

    bool is_jolly(int *list, int cap, bool* container){ 
     int difference = 0; 
     for(int i=0; i<cap-1; i++){ 
      difference = list[i] - list[i+1]; 
      if(abs(difference) < cap && abs(difference) >= 1 && container[difference] == false){ 
      container[difference] = true; 
      continue; 
      } 
      else return false; 
     } 
     return true; 
    } 

    int main(){ 
    int n; 
    bool used[30001]; 
    while(cin >> n){ 

     int * num_list = new int[n]; 
     for(int i=0; i<n; i++){ 
       cin >> num_list[i]; 
       used[i+1] = false; 
     } 
     if(is_jolly(num_list,n,used)) 
       cout << "Jolly" << endl; 
     else cout << "Not Jolly" << endl; 

     delete[] num_list; 
    } 

    return 0; 
    } 
+2

Вы пытались войти в свой код с помощью отладчика? – taocp

+3

Начните использовать 'std :: vector' вместо необработанных массивов, и вы увидите, что все ваши ошибки сбоя seg исчезнут! – CoryKramer

+6

Вы должны прочитать [это сообщение в блоге] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) Эрика Липперта о том, как отлаживать небольшие программы, такие как ваши, и применять описанные там методы. –

ответ

2

если разница может быть отрицательной (например, на входе 2 0 10000), то container[difference] использует отрицательный индекс (например, container[-10000]), и это будет вызывать выдаёт ошибку сегментации

for(int i=0; i<cap-1; i++){ 
     difference = list[i] - list[i+1]; 
     if(abs(difference) < cap && abs(difference) >= 1 && container[difference] == false){ 

лучше использовать:

for(int i=0; i<cap-1; i++){ 
     difference = abs(list[i] - list[i+1]); 
     if(difference < cap && difference >= 1 && container[difference] == false) { 

.... если это то, что вы хотите (я не знаю, в чем цель)

+0

Как только «разница» положительная, перейдите по коду из OP, весь этот оператор if() может быть следующим: 'if (разница PaulMcKenzie

+0

@PaulMcKenzie: но есть что' else return false' – firda

+0

Да, смотрите его сейчас. – PaulMcKenzie

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