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

时间:2018-11-19 06:34:36

标签: c++ recursion

我是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问题,再次是这种情况。

如果有人帮助我弄清楚我的代码出了什么问题,那就太好了。 预先感谢。

3 个答案:

答案 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方法将重新分配。