递归代码退出,退出代码为 3221225477

fat*_*ess 1 c++ recursion

我是 C++ 编程和 StackOverflow 的新手,但我对核心 Java 有一些经验。我想参加编程奥林匹克,我选择了 C++,因为 C++ 代码通常比同等的 Java 代码更快。

\n\n

我正在解决一些涉及分区级别的递归和 DP 的问题,我遇到了这个称为序列游戏的问题

\n\n

但不幸的是我的代码似乎不起作用。它退出时退出代码为 3221225477,但我无法从中获取任何信息。我记得 Java 在指出我的错误方面做得更好,但在 C++ 中我不知道发生了什么。顺便说一句,这是代码,

\n\n
#include <iostream>\n#include <fstream>\n#include <cstdio>\n#include <algorithm>\n#include <vector>\n#include <set>\nusing namespace std;\nint N, minimum, maximum;\nset <unsigned int> result;\nvector <unsigned int> integers;\nbool status = true;\n\nvoid score(unsigned int b, unsigned int step)\n{\n    if(step < N)\n    {\n        unsigned int subtracted;\n        unsigned int added = b + integers[step];\n        bool add_gate = (added <= maximum);\n        bool subtract_gate = (b <= integers[step]);\n        if (subtract_gate) \n            subtracted = b - integers[step];\n        subtract_gate = subtract_gate && (subtracted >= minimum);\n        if(add_gate && subtract_gate)\n        {\n            result.insert(added);\n            result.insert(subtracted);\n            score(added, step++);\n            score(subtracted, step++);\n        }\n        else if(!(add_gate) && !(subtract_gate))\n        {\n            status = false;\n            return;\n        }\n        else if(add_gate)\n        {\n            result.insert(added);\n            score(added, step++);\n        }\n        else if(subtract_gate)\n        {\n            result.insert(subtracted);\n            score(subtracted, step++);\n        }\n    }\n    else return;\n}\nint main()\n{\n    ios_base::sync_with_stdio(false);\n\n    ifstream input("input.txt"); // attach to input file\n    streambuf *cinbuf = cin.rdbuf(); // save old cin buffer\n    cin.rdbuf(input.rdbuf()); // redirect cin to input.txt\n\n    ofstream output("output.txt"); // attach to output file\n    streambuf *coutbuf = cout.rdbuf(); // save old cout buffer\n    cout.rdbuf(output.rdbuf()); // redirect cout to output.txt\n\n    unsigned int b;\n    cin>>N>>b>>minimum>>maximum;\n\n    for(unsigned int i = 0; i < N; ++i)\n        cin>>integers[i];\n    score(b, 0);\n    set<unsigned int>::iterator iter = result.begin();\n    if(status)\n        cout<<*iter<<endl;\n    else \n        cout<<-1<<endl;\n\n    cin.rdbuf(cinbuf);\n    cout.rdbuf(coutbuf);\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

(注意:我故意不使用 typedef)。

\n\n

我在 Windows 机器中使用 mingw-w64 编译了这段代码,输出如下:

\n\n
\n

[在 19.8 秒内完成,退出代码 3221225477] ...

\n
\n\n

虽然我有一个intel i5-8600,但是编译花费了很多时间,大部分时间都被杀毒软件用来扫描我的exe文件,甚至有时在没有杀毒软件任何干预的情况下持续编译很长时间。

\n\n

(注意:我没有使用命令行,而是使用 sublime text 来编译它)。 \n我什至尝试了 tdm-gcc,并且再次出现了一些其他特殊的退出代码。我什至尝试在 Ubuntu 机器上运行它,但不幸的是它找不到输出文件。当我在Codechef Online IDE上运行它时,虽然运行不正常,但是错误信息没有 mingw 的那么可怕。\n它说出现运行时错误,并显示“SIGSEGV”作为错误代码。代码厨师指出

\n\n
\n

SIGSEGV 是由无效内存引用或分段错误引起的错误(信号)。您可能正在尝试越界访问数组元素或尝试使用过多的内存。分段错误的其他一些原因包括:使用未初始化的指针、取消引用 NULL 指针、访问程序不拥有的内存。

\n
\n\n

我已经尝试解决这个问题好几天了,现在我真的很沮丧。首先,当我开始解决这个问题时,我使用了 c 数组,然后更改为向量,最后现在更改为 std::set,同时希望它能解决问题,但没有任何效果。我尝试了另一个 dp 问题,情况再次如此。

\n\n

如果有人帮助我找出代码中的问题,那就太好了。\n提前致谢。

\n

Sun*_*ius 5

3221225477 转换为十六进制是 0xC0000005,它代表STATUS_ACCESS_VIOLATION,这意味着您试图访问(读、写或执行)无效内存。

我记得 Java 在指出我的错误方面做得更好,但在 C++ 中我不知道发生了什么。

当您遇到程序崩溃时,您应该在调试器下运行它。由于您在 Windows 上运行代码,因此我强烈推荐 Visual Studio 2017 Community Edition。如果你在它下面运行你的代码,它会准确地指出崩溃发生的位置。

至于崩溃本身,正如 PaulMcKenzie 在评论中指出的那样,您正在索引一个空向量,这使得std::cin写入超出内存范围。