递归代码以退出代码 3221225477 退出
Posted
技术标签:
【中文标题】递归代码以退出代码 3221225477 退出【英文标题】:Recursive code exits with exit code 3221225477 【发布时间】:2018-11-19 06:34:36 【问题描述】:我是 C++ 编程和 *** 的新手,但我对核心 Java 有一些经验。我想参加编程奥林匹克比赛,我选择了 c++,因为 c++ 代码通常比等效的 Java 代码更快。
我正在解决一些涉及区域级别的递归和 DP 的问题,我遇到了这个名为 Sequence game的问题
但不幸的是,我的代码似乎不起作用。它以退出代码 3221225477 退出,但我无法从中做出任何事情。我记得 Java 在指出我的错误方面做得更好,但是在 c++ 中我不知道发生了什么。这是代码顺便说一句,
#include <iostream>
#include <fstream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
int N, minimum, maximum;
set <unsigned int> result;
vector <unsigned int> integers;
bool status = true;
void score(unsigned int b, unsigned int step)
if(step < N)
unsigned int subtracted;
unsigned int added = b + integers[step];
bool add_gate = (added <= maximum);
bool subtract_gate = (b <= integers[step]);
if (subtract_gate)
subtracted = b - integers[step];
subtract_gate = subtract_gate && (subtracted >= minimum);
if(add_gate && subtract_gate)
result.insert(added);
result.insert(subtracted);
score(added, step++);
score(subtracted, step++);
else if(!(add_gate) && !(subtract_gate))
status = false;
return;
else if(add_gate)
result.insert(added);
score(added, step++);
else if(subtract_gate)
result.insert(subtracted);
score(subtracted, step++);
else return;
int main()
ios_base::sync_with_stdio(false);
ifstream input("input.txt"); // attach to input file
streambuf *cinbuf = cin.rdbuf(); // save old cin buffer
cin.rdbuf(input.rdbuf()); // redirect cin to input.txt
ofstream output("output.txt"); // attach to output file
streambuf *coutbuf = cout.rdbuf(); // save old cout buffer
cout.rdbuf(output.rdbuf()); // redirect cout to output.txt
unsigned int b;
cin>>N>>b>>minimum>>maximum;
for(unsigned int i = 0; i < N; ++i)
cin>>integers[i];
score(b, 0);
set<unsigned int>::iterator iter = result.begin();
if(status)
cout<<*iter<<endl;
else
cout<<-1<<endl;
cin.rdbuf(cinbuf);
cout.rdbuf(coutbuf);
return 0;
(注意:我故意没有使用 typedef)。
我在 windows 机器上用 mingw-w64 编译了这段代码,输出如下:
[在 19.8 秒内完成,退出代码为 3221225477] ...
虽然我有一个intel i5-8600,但是编译时间太长了,大部分时间都被杀毒软件扫描了我的exe文件,甚至有时在没有杀毒软件干预的情况下一直编译很长时间-病毒。
(注意:我没有使用命令行,而是使用了 sublime text 来编译它)。 我什至尝试了 tdm-gcc,但又出现了一些其他特殊的退出代码。我什至尝试在 Ubuntu 机器上运行它,但不幸的是它找不到输出文件。当我在Codechef Online IDE 上运行它时,即使它没有正常运行,但错误消息没有 mingw 的那么可怕。 它表示存在运行时错误,并且“SIGSEGV”显示为错误代码。 Codechef 声明
SIGSEGV 是由无效的内存引用引起的错误(信号)或 分段错误。您可能正在尝试访问数组 元素超出范围或尝试使用过多内存。一些 分段错误的其他原因是:使用未初始化的 指针,空指针的取消引用,访问内存 程序不拥有。
我试图解决这个问题已经有几天了,现在我真的很沮丧。首先,当我开始解决这个问题时,我使用了 c 数组,然后改为向量,最后改为 std::set,同时希望它会解决问题,但没有任何效果。我又试了一个dp问题,又是这样。
如果有人帮我找出我的代码有什么问题,那就太好了。 提前致谢。
【问题讨论】:
vector <unsigned int> integers;...for(unsigned int i = 0; i < N; ++i) cin>>integers[i];
-- 您不能使用 []
将项目添加到向量。这不是vector
的工作方式。向量的大小可以通过以适当的大小构造它们,或者使用push_back
、emplace_back
或insert
。您所做的只是通过溢出缓冲区来调用未定义的行为。此外,如果您可以使用 Visual Studio,它会立即向您显示您的错误。
它解决了我的问题。这比我预期的要简单得多。
为什么不使用 typedef?尤其是当您在using namespace std;
中有效地使用了自动化的
【参考方案1】:
3221225477转换成十六进制是0xC0000005,代表STATUS_ACCESS_VIOLATION,表示你试图访问(读、写或执行)无效内存。
我记得 Java 在指出我的错误方面做得更好,但在 c++ 中我不知道发生了什么。
当您遇到程序崩溃时,您应该在调试器下运行它。由于您在 Windows 上运行代码,我强烈推荐 Visual Studio 2017 社区版。如果你在它下面运行你的代码,它会指出崩溃发生的确切位置。
至于您的崩溃本身,正如 PaulMcKenzie 在评论中指出的那样,您正在索引一个空向量,这使得 std::cin
写入越界内存。
【讨论】:
实际上我一直在尝试使用像 sublime text 这样的文本编辑器,但它们没有预先打包好的调试器。但是我真的觉得缺少调试器。几天前我尝试安装 sublime 文本调试器,但无法让它工作,也许我会从现在开始转向 Ecllipse CDT。【参考方案2】:integers
是一个vector
,它是一个动态连续数组,其大小在编译时是未知的。所以当它最初被定义时,它是空的。您需要插入vector
。更改以下内容:
for(unsigned int i = 0; i < N; ++i)
cin>>integers[i];
对此:
int j;
for(unsigned int i = 0; i < N; ++i)
cin>> j;
integers.push_back(j);
【讨论】:
【参考方案3】:P.W 的答案是正确的,但使用 push_back
的替代方法是在已知 N
之后预先分配向量。然后你可以像以前一样从cin
直接读取向量元素。
integers = vector<unsigned int>(N);
for (unsigned int i = 0; i < N; i++)
cin >> integers[i];
此方法的另一个优点是只为向量分配一次内存。如果底层缓冲区填满,push_back
方法将重新分配。
【讨论】:
以上是关于递归代码以退出代码 3221225477 退出的主要内容,如果未能解决你的问题,请参考以下文章
APACHE 崩溃:父进程:子进程以状态 3221225477 退出 -- 正在重新启动
C++ 进程在 4.017 秒后退出,返回值 3221225477