【问题标题】:Magic Square in C++C++ 中的魔方
【发布时间】:2015-04-14 15:21:50
【问题描述】:

又一个魔方问题。我正在用 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";
    }
}

它有什么问题?我声明指针的方式是否正确?

【问题讨论】:

  • 你还没有初始化矩阵行指针。

标签: c++ arrays fault magic-square


【解决方案1】:

你创建一个指针数组:

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&lt;int&gt; 而不是 int* 以省去调用者处理和删除指针的麻烦。

【讨论】:

  • 是的,我这样做了,然后简单地展平矩阵并返回向量的数据,但最终效果不佳,因为我找不到迭代它们的重要方法.不过我已经解决了这个问题,所以我可以切换回它们。
【解决方案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];

【讨论】:

    【解决方案3】:

    您正在取消引用空指针。你有一个二维数组:

    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];
    }
    

    【讨论】:

    • whatever 会是n吗?
    • @T145 如果它应该是方形的,那么是的。
    【解决方案4】:

    使用向量。

        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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-05
      相关资源
      最近更新 更多