首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归代码退出代码3221225477

递归代码退出代码3221225477
EN

Stack Overflow用户
提问于 2018-11-19 06:34:36
回答 2查看 6.9K关注 0票数 1

我对c++编程和StackOverflow很陌生,但我对核心Java有一些经验。我想参加奥林巴斯的编程,我选择了c++,因为c++代码通常比等价的c++代码更快。

我正在解决一些在分区级别涉及递归和DP的问题,我遇到了一个名为序列博弈的问题。

但不幸的是,我的代码似乎不起作用。它的出口代码是3221225477,但我无法从中得到任何东西。我记得Java在指出我的错误方面做得更好,但是在c++中,我对正在发生的事情一无所知。这是密码,

代码语言:javascript
复制
#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;
}

(注:我故意不使用ty胡枝子)。

我在一台windows机器中编译了这段代码,它的输出如下:

在19.8秒完成,出口代码3221225477 .

虽然我有一个英特尔i5-8600,它花了这么多的时间来编译,大部分时间是由防病毒扫描我的exe文件,甚至有时它继续编译很长时间,没有任何干预的反病毒。

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

SIGSEGV是由无效的内存引用或分段错误引起的错误(信号)。您可能试图访问超出界限的数组元素,或者试图使用过多的内存。造成分段错误的其他原因包括:使用未初始化的指针、取消对空指针的引用、访问程序不拥有的内存。

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

如果有人能帮我找出我的代码有什么问题,那就太好了。提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2018-11-19 06:44:27

转换为十六进制的3221225477是0xC0000005,它代表违犯,这意味着您试图访问(读、写或执行)无效内存。

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

当您遇到程序崩溃时,应该在调试器下运行它。由于您在Windows上运行代码,我强烈推荐VisualStudio2017 Community。如果您在它下面运行代码,它将指出崩溃发生的确切位置。

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

票数 5
EN

Stack Overflow用户

发布于 2018-11-19 07:23:15

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

代码语言:javascript
复制
integers = vector<unsigned int>(N);
for (unsigned int i = 0; i < N; i++)
    cin >> integers[i];

该方法的另一个优点是只为向量分配一次内存。如果基础缓冲区被填满,push_back方法将重新分配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53369440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档