Выдаёт ошибку: vector subscript out of range. Никак не могу найти ошибку. Помоги пожалуйста.
#include <iostream>
#include <vector>
#include <iostream>
#include <math.h>
using namespace std;
vector<vector<int>> undef;
void undefMatrix( int col) {
int i, j, n, row2, k, p, c;
row2 = pow(2, col);
int binary[11][1025];
for (i = 1; i <= col; i++)
for (j = 1; j <= row2; j++)
binary[i][j] = 0;
for (j = 1; j <= col; j++)
{
k = row2 / (pow(2, j));
p = 0;
c = 0;
for (i = k + 1; i <= row2; i++)
{
if (p<k)
{
binary[j][i] = 1;
p++;
}
else if (c<k - 1)
{
binary[j][i] = 0;
c++;
}
else
{
p = 0;
c = 0;
}
}
}
undef.resize(col);
for (int i = 0; i < col; i++)
undef[i].resize(row2);
for (int i = 1; i <= col; i++) {
for (int j = 1; j <= row2; j++) {
undef[i][j] = binary[i][j];
}
}
for (int i = 0; i < undef.size(); i++) {
for (int j = 0; j < undef[i].size(); j++) {
cout << undef[i][j];
}
cout << endl;
}
}
int main() {
int col;
cout << "Enter number of columns of matrixes: ";
cin >> col;
undefMatrix(col);
system("pause");
return 0;
}
У вас предпоследний цикл двойной идёт от 1 до col (включительно) и от 1 до row2 (включительно). А вектор размера col на row2. У него нет элемента undef[col][row2] и вообще никаких элементов дальше undef[col-1][row2-1].
Когда вы пишите vector.resize(5) это значит выделить память (минимум) под пять элементов и предоставить вам доступ только к этим пяти элементам. То есть от vector[0] до vector[4]
Если позволите, то ещё несколько общих советов:
Зачем использовать статический массив вообще? Используйте сразу вектор.
Если вам нужно возвести 2 в какую-то степень, используйте битовые сдвиги.
Если вам нужно занулить непрерывный участок памяти (для C-style одномерных массивов), используйте memset.
Старайтесь избегать циклов, начинающихся с 1 при обходе контейнеров или массивов. Приучите себя начинать счёт всегда с нуля.
Не делайте глобальных переменных там, где в этом нет смысла (а лучше вообще никогда не делайте глобальных переменных).
Использование в цикле for метода std::vector::size лучше избегать, чтобы он каждый раз не вызывался на новом шаге. Выносите его из цикла, присваивайте значение переменной и используйте в цикле её.
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
оператор break может использовать только внутри цикла
Как сделать событие, которое запускается когда scroll достигает самого верха в блоке?