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



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

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

但不幸的是,我的代码似乎不起作用。它退出时的退出代码为3221225477,但我对此无能为力。我记得Java在指出我的错误方面做得更好,但在c++中,我对发生的事情一无所知。这是代码btw,

#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.8s内完成,退出代码为3221225477]。。。

虽然我有一台英特尔i5-8600,但编译花了很多时间,大部分时间都是由防病毒软件扫描我的exe文件,甚至有时它会在没有防病毒软件干预的情况下持续编译很长时间。

(注意:我没有使用命令行,而是使用了崇高的文本来编译它(。我甚至尝试了tdm-gcc,然后又出现了一些其他特殊的退出代码。我甚至试着在Ubuntu机器上运行它,但不幸的是它找不到输出文件。当我在Codechef Online IDE上运行它时,尽管它没有正常运行,但错误消息没有mingw的那么可怕。它表示存在运行时错误,"SIGSEGV"显示为错误代码。Codechef表示

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

几天来我一直在努力解决这个问题,现在我真的很沮丧。首先,当我开始解决这个问题时,我使用了c数组,然后改为向量,最后改为std::set,同时跳到它将解决问题,但什么都没用。我尝试了另一个dp问题,结果又是这样。

如果有人帮我找出代码中的错误,那就太好了。提前谢谢。

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

我记得Java在指出我的错误方面做得更好,但在c++中,我对发生的事情一无所知。

当你遇到程序崩溃时,你应该在调试器下运行它。由于您在Windows上运行代码,我强烈推荐您使用Visual Studio 2017社区版。若你们在它下面运行你们的代码,它会准确地指向崩溃发生的地方。

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

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

p.W的答案是正确的,但使用push_back的另一种选择是在已知N之后预分配向量。然后,您可以像以前一样从cin直接读取矢量元素。

integers = vector<unsigned int>(N);
for (unsigned int i = 0; i < N; i++)
cin >> integers[i];

这种方法的额外优点是只为向量分配一次内存。如果底层缓冲区已满,push_back方法将重新分配。

相关内容

最新更新