C++魔术广场
Magic Square in 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";
}
}
它有什么问题?我声明指针的方式是否正确?
创建一个指针数组:
int **matrix = new int *[n]
但是不要初始化它们以指向任何内容;因此,当您尝试取消引用它们时,隔离错误。如果您确实必须处理指针,则为每个指针分配一个数组以指向:
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*
,以节省调用方处理和删除指针的麻烦。
你只是部分实例化矩阵。 您有int **matrix = new int *[n]
它将为您提供行,但您正在定义列。 要完全初始化,您需要使用
int **matrix = new int *[n];
for (int i = 0; i < col_dimension; i++)
matrix[i] = new int[col_dimension];
您正在取消引用空指针。您有一个二维数组:
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];
}
使用向量。
vector<vector<int> > matrix(n, vector<int>(n, 0));
OddMagicSquare(matrix, n, -1);
void OddMagicSquare(vector<vector<int>> &matrix, int n)
{
auto nsqr = n * n;
// start position
auto row = rand() % n;
auto col = rand() % n;
auto start = 1;
for (auto index = start; index <= nsqr + (start -1); ++index)
{
while (col >= n)
col -= n;
while (col < 0)
col += n;
while (row >= n)
row -= n;
while (row < 0)
row += n;
matrix[row][col] = index;
row--;
col++;
if (index%n == 0)
{
row += 2;
--col;
}
}
}
相关文章:
- 将图像魔术转换命令转换为魔术++c++代码
- 将图像魔术 blob 保存到节点缓冲区
- 在C++上创建魔术包
- C++或宏魔术来生成方法和转发参数
- 这是如何运作的?(C 名称查找魔术)
- 如何在C++中避免魔术字符串和魔术数字
- 2尺寸阵列魔术广场
- 魔术广场错误的位置
- 如何使用C++模板魔术来对类型进行模式匹配
- C 11魔术静态在Visual Studio 2012中的解决方法
- 最终确定魔术方形生成器
- C 读取魔术方形检查器的Console Row中的输入
- C 从文件中读取并比较魔术号码
- C++魔术广场
- 使用 c++ 通过魔术获取 rgb 颜色
- 使用 C++ 的视觉魔术,va_arg不适用于具有双精度的 64 位架构
- C++的魔术,这个表达式 x = y - x + (y = x)
- 如何使用图像魔术使用自定义量化表将 PNM 文件压缩为 JPEG
- 将错误与图形魔术链接
- 将魔术包发送到certianip的程序