Ошибка сегментации (дамп ядра) при инициализации матрицы в c ++ - PullRequest
0 голосов
/ 30 октября 2018

Я получаю ошибку Segmentation fault (core dumped) при выполнении программы, которая создает экземпляр класса Matrice и создает его в своем конструкторе.

вот мой простой код:

#include <iostream>
#include <vector>
#include <ctime>
#include <cstdlib>

class Matrice{
public:
  std::vector<std::vector<int> > mat;

  Matrice(){
    for(int i=0; i < 3; ++i) {
      for(int j=0; j < 2; ++j) {
        mat[i][j] = rand()%(10-0)+0;
      }
    }
  }
};


int main(){
  Matrice mat1;
  return 0;
}

может кто-нибудь просветить меня.

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Вам необходимо изменить размер матрицы, прежде чем получить доступ к элементам:

mat.resize(3);
for( int i=0; i < 3; ++i)
{
  mat[i].resize(2);
}
0 голосов
/ 30 октября 2018
Matrice(){
    for(int i=0; i < 3; ++i) {
        mat.push_back(std::vector<int>());
        for(int j=0; j < 2; ++j) {
            mat[i].push_back(rand()%(10-0)+0);
        }
    }
}

Edit:

Объяснение: векторам требуется вызов функции push_back для добавления элемента в конец вектора, и он автоматически перераспределяет пространство для вектора, если он превышает размер, первоначально выделенный для вектора. Поскольку это вектор векторов, сначала нужно отодвинуть произвольный вектор назад, а затем на каждый произвольный вектор, сохраненный в mat [i], мы push_back требуемое случайное целочисленное значение.

0 голосов
/ 30 октября 2018

Вы используете std::vector неправильно. Пожалуйста, смотрите https://en.cppreference.com/w/cpp/container/vector/operator_at

Оператор [] возвращает ссылку на существующее значение. В отличие от std::map, он не вставляет новое значение. Используйте std::vector::push_back() для добавления элементов в вектор.

...