【问题标题】:C++ Function causing Application Crash导致应用程序崩溃的 C++ 函数
【发布时间】:2015-04-10 21:27:07
【问题描述】:

我目前对为什么这个 C++ 函数不断使我当前的程序崩溃感到困惑。

您可能会看到,我来自 Java 背景,现在非常热衷于学习像 C++ 这样的语言。

这个函数应该在每个位置用一个新节点填充一个节点类型的二维数组。我想使用二维数组而不是向量,因为这是我正在尝试编写的数独求解器。

当我构建和运行应用程序时,只是崩溃并说:

“SudokuSolver.exe 已停止工作” 问题签名: 问题事件名称:BEX 应用程序名称:SudokuSolver.exe 应用程序版本:0.0.0.0 申请时间戳:55283d72 故障模块名称:MSVCR110.dll 故障模块版本:11.0.51106.1 故障模块时间戳:5098858e 异常偏移:000a326c 异常代码:c0000409 异常数据:00000007 操作系统版本:6.3.9600.2.0.0.768.101 区域设置 ID:1033 附加信息 1:332b 附加信息 2:332b994896f66a7b5d5fb96032f7fbd2 附加信息 3:2fa1 附加信息4:2fa12dec635ddb7f7a8e7c8690abd06a

我正在使用 Eclipse 编写 C++ 代码。

下面是有问题的函数。

void fillArray(Node grid[][matrixSizeY], string filePath) {

    int index = 0;

    ifstream inFile;

    inFile.open(filePath);

    // Check for Errors
    if (inFile.fail()) {
        cerr << "Error Opening File" << endl;
        exit(1);
    }

    while (!inFile.eof()) {

        string line;

        getline(inFile, line);

        // Get a Vector of each character in the String
        vector<string> data;
        Utilities::splitEachCharacter(line, data);

        printVect(data);

        for (int i = 0; i < matrixSizeY; i++) {

            string temp = data[i];

            int value = stoi(temp, nullptr, 0);

            Node node(index, i, value);

            grid[index][i] = node;
        }

        data.clear();
        line = "";
        index++;
    }
}

我觉得我可能应该使用我为矩阵中的每个位置调用的函数来创建一个指向新对象的指针数组,可能是这样的:

Node* getNode(int x, int y, int data) {

    Node *node = new Node(x, y, data);

    return node;

}

但我真的很困惑如何制作这样的指针数组。一些帮助和澄清/解释将不胜感激。

提前致谢

更新:

该功能现在可以工作了,我做了以下更改:

// Function Definition
void fillArray(Node (&grid)[matrixSizeX][matrixSizeY], string filePath);

【问题讨论】:

  • "想要使用二维数组而不是向量,因为这是我尝试编写的数独求解器。"
  • while (!inFile.eof()) 错了,应该是while (getline(inFile, line))。不要使用原始指针和新指针。如果它很小,只需按值返回节点。
  • 谢谢你们帮助cmets!每一个都帮助我找出问题所在

标签: c++ arrays pointers matrix


【解决方案1】:

异常代码对应堆栈缓冲区溢出。这可能表明一些没有结束的嵌套调用或局部变量大小的任何过量,可以通过编译参数解决。确实,线条

Node node(index, i, value);
grid[index][i] = node;

至少暗示使用节点结构的复制构造函数。请注意,您通过值传递 Node grid[][matrixSizeY],而不是引用(返回时您的工作会丢失),如果数组很大,副本将对缓冲区收费。接下来,您不指定第一个数组维度(这是合法的?我对此非常不确定,因为我认为只有最后一个维度可能是可选的)。

【讨论】:

  • 感谢您的帮助,我意识到我做错了很多事情,事实证明在 Java 之后学习 C++ 是相当棘手的。我觉得我应该从前者开始。如果您有兴趣,请查看我的编辑以查看我的更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2016-06-04
相关资源
最近更新 更多