我是C ++编程和StackOverflow的新手,但是我对Java有所了解。我想参加奥林匹克竞赛的编程,所以选择c ++,因为c ++代码通常比等效的Java代码要快。
我正在解决一些涉及区域级递归和DP的问题,并且遇到了名为Sequence game
的问题。但是不幸的是我的代码似乎不起作用。它以退出代码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.8秒钟内完成,退出代码为3221225477] ...
尽管我有一个Intel i5-8600,但是编译花费了很多时间,防病毒软件花费了很多时间来扫描我的exe文件,甚至有时它可以长时间保持编译状态,而不会受到反病毒软件的任何干预。 -病毒。
(注意:我没有使用命令行,而是使用了崇高的文本来编译它)。 我什至尝试了tdm-gcc,然后又出现了一些其他特殊的退出代码。我什至试图在Ubuntu机器上运行它,但不幸的是它找不到输出文件。当我在Codechef Online IDE上运行它时,即使它无法正常运行,但该错误消息也没有mingw的那么可怕。 它说存在运行时错误,并且“ SIGSEGV”显示为错误代码。 Codechef指出
SIGSEGV是由无效的内存引用引起的错误(信号),或者 细分错误。您可能正在尝试访问数组 元素超出范围或尝试使用过多的内存。一些 分段错误的其他原因是:使用未初始化 指针,对NULL指针的取消引用,访问 程序不拥有。
几天来我一直试图解决这个问题,现在我真的很沮丧。首先,当我开始解决此问题时,我使用了c数组,然后更改为向量,最后更改为std :: set,同时希望它可以解决问题,但没有任何效果。我尝试了另一个dp问题,再次是这种情况。
如果有人帮助我弄清楚我的代码出了什么问题,那就太好了。 预先感谢。
答案 0 :(得分:2)
3221225477转换为十六进制是0xC0000005,代表STATUS_ACCESS_VIOLATION,表示您试图访问(读取,写入或执行)无效的内存。
我记得Java在指出我的错误方面做得更好,但是在c ++中,我对正在发生的事情一无所知。
当您遇到程序崩溃时,应在调试器下运行它。由于您是在Windows上运行代码,因此我强烈建议您使用Visual Studio 2017 Community Edition。如果在其下运行代码,它将指向崩溃发生的确切行。
对于崩溃本身,正如PaulMcKenzie在评论中指出的那样,您正在索引一个空向量,这使std::cin
写入越界内存。
答案 1 :(得分: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);
}
答案 2 :(得分:0)
P.W的答案是正确的,但是使用push_back
的另一种方法是在已知N
之后预先分配向量。然后,您可以像以前一样从cin
中直接读入向量元素。
integers = vector<unsigned int>(N);
for (unsigned int i = 0; i < N; i++)
cin >> integers[i];
此方法的另一个优点是只为向量分配了一次内存。如果基础缓冲区已满,push_back
方法将重新分配。