我是 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}\nRun Code Online (Sandbox Code Playgroud)\n\n(注意:我故意不使用 typedef)。
\n\n我在 Windows 机器中使用 mingw-w64 编译了这段代码,输出如下:
\n\n\n\n\n[在 19.8 秒内完成,退出代码 3221225477] ...
\n
虽然我有一个intel i5-8600,但是编译花费了很多时间,大部分时间都被杀毒软件用来扫描我的exe文件,甚至有时在没有杀毒软件任何干预的情况下持续编译很长时间。
\n\n(注意:我没有使用命令行,而是使用 sublime text 来编译它)。 \n我什至尝试了 tdm-gcc,并且再次出现了一些其他特殊的退出代码。我什至尝试在 Ubuntu 机器上运行它,但不幸的是它找不到输出文件。当我在Codechef Online IDE上运行它时,虽然运行不正常,但是错误信息没有 mingw 的那么可怕。\n它说出现运行时错误,并显示“SIGSEGV”作为错误代码。代码厨师指出
\n\n\n\n\nSIGSEGV 是由无效内存引用或分段错误引起的错误(信号)。您可能正在尝试越界访问数组元素或尝试使用过多的内存。分段错误的其他一些原因包括:使用未初始化的指针、取消引用 NULL 指针、访问程序不拥有的内存。
\n
我已经尝试解决这个问题好几天了,现在我真的很沮丧。首先,当我开始解决这个问题时,我使用了 c 数组,然后更改为向量,最后现在更改为 std::set,同时希望它能解决问题,但没有任何效果。我尝试了另一个 dp 问题,情况再次如此。
\n\n如果有人帮助我找出代码中的问题,那就太好了。\n提前致谢。
\n3221225477 转换为十六进制是 0xC0000005,它代表STATUS_ACCESS_VIOLATION,这意味着您试图访问(读、写或执行)无效内存。
我记得 Java 在指出我的错误方面做得更好,但在 C++ 中我不知道发生了什么。
当您遇到程序崩溃时,您应该在调试器下运行它。由于您在 Windows 上运行代码,因此我强烈推荐 Visual Studio 2017 Community Edition。如果你在它下面运行你的代码,它会准确地指出崩溃发生的位置。
至于崩溃本身,正如 PaulMcKenzie 在评论中指出的那样,您正在索引一个空向量,这使得std::cin写入超出内存范围。
| 归档时间: |
|
| 查看次数: |
9450 次 |
| 最近记录: |