/ / Magic Square в C ++ - C ++, масиви, грешки, магически квадрат

Magic Square в C ++ - C ++, масиви, грешки, магически квадрат

Още един магически квадрат проблем. Създавам странна магическа квадратна програма в C ++ и по някаква причина програмата продължава да дава грешка в сегментацията на грешките и да се откаже.Тук е кодът:

#include <iostream>

using std::cin;
using std::cout;

#include <cstring>

using std::memset;

int *generateOddSquare(int n) {
if (n % 2 != 0 && n >= 3) {
int row = 0, col = n / 2, square = n * n;
int **matrix = new int *[n], *dest = new int[square];

memset(matrix, 0, sizeof(matrix[0][0]) * square);

for (int i = 1; i <= square; i++) {
matrix[row][col] = i;

if (i % n == 0)
row++;
else {
if (row == 0)
row = n - 1;
else
row--;

if (col == (n - 1))
col = 0;
else
col++;
}
}

for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
dest[(i * n) + j] = matrix[i][j];
}
}

return dest;
} else
return NULL;
}

int main() {
int *arr = generateOddSquare(3);

for (int i = 0; i < 9; i++) {
cout << arr[i] << "n";
}
}

Какво не е наред с него? Има ли начин, по който декларирам указанията си правилно?

Отговори:

2 за отговор № 1

Създавате набор от указатели:

int **matrix = new int *[n]

но не инициализирайте тези, които да сочат към нещо, оттук и грешката на segementation, когато се опитвате да ги dereference.If наистина трябва да жонглира указатели, а след това разпределят един масив за всеки да посочи:

for (int i = 0; i < n; ++i) {
matrix[i] = new int[n];
}

и не забравяйте да изтриете всички тези разпределения, ако се интересувате от изтичане на паметта.

Освен ако това не е упражнение в мазохизма, използвайте стандартната библиотека, за да улесните живота си:

std::vector<std::vector<int>> matrix(n, std::vector<int>(n));

и обратно std::vector<int> отколкото int* за да запишете на обаждащия се неприятностите на жонглиране и изтриването на показалеца.


1 за отговор № 2

Вие само частично създавате матрица. Ти имаш int **matrix = new int *[n] който ще ви даде вашите редове, но вие определяте колоните. За да се инициализирате напълно, трябва да използвате

int **matrix = new int *[n];
for (int i = 0; i < col_dimension; i++)
matrix[i] = new int[col_dimension];

1 за отговор № 3

Дереферирате нулеви указания. Имате 2-d масив:

int **matrix = new int *[n];

Това, че изчистите (неправилно - размерът трябва да бъде трябва да бъде n * sizeof(*matrix)):

memset(matrix, 0, sizeof(matrix[0][0]) * square);

И веднага пишете на:

for (int i = 1; i <= square; i++) {
matrix[row][col] = i;
....
}

Но matrix[0] е NULL, Трябва първо да разпределите всички указания!

for (int i = 0; i < n; ++i) {
matrix[i] = new int[whatever];
}