ошибка сегментации при доступе к элементам вектора векторов - PullRequest
0 голосов
/ 03 сентября 2018

Проблема : Я пытаюсь инициализировать квадратный двумерный массив и найти абсолютную разницу суммы его диагоналей. Для этой цели я написал следующий код.

#include<vector>
#include<iostream>

using namespace std;

vector<vector<int>> init() // function to initialize the array
{
  int size;
  cin>>size;
  vector<vector<int>> vector(size);

  for(int i = 0; i < size; ++i)
  {
    vector[i].resize(size);
    for(int j = 0; j < size; ++j)
    {
      cin>>vector[i][j];
    }
  }


  return vector;
}



int diagonal_diff(vector<vector<int>> vector)// function to find difference                                                                                                               
{
  int diff;

  auto sum_1  = 0;
  auto size = vector.size();
  for(auto i  = 0; i < size; ++i)
  {
    auto j = i;
    sum_1 = vector[i][j] + sum_1;

  }

  int sum_2 = 0;
  for(auto i  = size -1; i >= 0; --i)
  {
    auto j = (size-1) - i;
    sum_2 = vector[i][j] + sum_2;

  }

  diff = sum_1 - sum_2;
  diff = (diff >= 0)? diff:diff*(-1);

  return diff;
}

int main()
{
  auto vector = init();//initialising array

  for(auto i  = 0; i < vector.size(); ++i)//printing the array
  {
    for(auto j = 0; j < vector.size(); ++j )
    {
      cout<< vector[i][j];
    }
  }

  auto temp = diagonal_diff(vector);// calling difference function
  cout<<temp<<endl;


  return 0;

}

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

Я пытался решить эту проблему от hackerRank. Если я закомментирую строку, которая вызывает функцию diagonal_diff (), то код работает нормально. Поэтому я думаю, что ошибка в функции diagonal_diff ().

1 Ответ

0 голосов
/ 04 сентября 2018

внутри diagonal_diff у вас есть следующий цикл:

int sum_2 = 0;
for (auto i  = size - 1; i >= 0; --i)
{
    auto j = (size-1) - i;
    sum_2 = vector[i][j] + sum_2;   
}

Проблема в том, что size объявление выглядит так:

auto size = vector.size();

vector.size() возвращает вам size_t тип объекта, что означает отсутствие отрицательных значений.

Снова посмотрите на ваш цикл и посмотрите на i объявление:

auto i  = size - 1

Поскольку size имеет тип size_t, ваш i будет автоматически size_t. Теперь условие остановки вашего цикла: i >= 0, что означает всегда true в случае, если i равно size_t. Когда i равно 0, и вы попадаете в часть третьего цикла: --i, вместо получения -1, он получает наибольшее значение size_t. Тогда вы делаете: sum_2 = vector[i][j] + sum_2; и получаете исключение.

Чтобы решить эту проблему, все, что вам нужно сделать, это изменить объявление i на: int i = size - 1.

Примечание. Настоятельно не рекомендуется использовать vector в качестве имени, особенно если вы не используете using namespace std; внутри своего кода. vector - это имя класса, и оно может привести к конфликтам кода .. вместо него можно использовать vec.

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