Векторы ошибки сегментации (сброшенные ядра) - PullRequest
0 голосов
/ 27 февраля 2020

Я пытался написать простую программу, которая получает числа от пользователей, а затем сортирует их. Я впервые использовал векторы и получил «Ошибка сегментации (ядро сброшено)» в терминале. Может ли smbd помочь мне исправить этот код? Я думаю, что есть проблема в функции sortowan ie () с table.erase (), но я могу ошибаться.

#include <iostream>
#include <vector>
using namespace std;

vector <int> table;
vector <int> sorted;

void out(){
 for( size_t i = 0; i < table.size(); i++ ){
       cout << table[i] << ", ";
   }
}

int y=table[0];
int z;

void sortowanie(){
    for( size_t i = 0; i < table.size(); i++ ){
       if(table[i]<y){
           y=table[i];
           z=i;
       }

   }
   sorted.push_back(y);
   table.erase(table.begin()+z);

   if(table.size() == 0){
       out();
   }
   else{
       sortowanie();
   }


}

void dodawanie(){
    int x;
    cin >> x;
    table.push_back(x);

    if(x == 0){
        sortowanie();
    }
    else{
        dodawanie();
    }
}
int main() 
{
    cout << "podaj liczby z przedziału liczb naturalnych \n";

    dodawanie();
    return 0;
}

1 Ответ

0 голосов
/ 27 февраля 2020

table.erase(table.begin()+z); определенно является проблемой, поскольку z не всегда назначается z=i;, а только тогда, когда table[i]<y. Так что возьмите назначение из оператора if. В противном случае ваш z будет увеличивать table.begin() за пределы, что приводит к UB, что приводит к вашему cra * sh. Кроме того, вы не должны удалять начало, если вектор пуст, поэтому поместите стирание в выражение if(table.begin()+z < table.end()), которое должно предотвращать cra sh во всех случаях. И сделать z локальной переменной sortowanie.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...