递归代码以退出代码 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 &lt;unsigned int&gt; integers;...for(unsigned int i = 0; i &lt; N; ++i) cin&gt;&gt;integers[i]; -- 您不能使用 [] 将项目添加到向量。这不是vector 的工作方式。向量的大小可以通过以适当的大小构造它们,或者使用push_backemplace_backinsert。您所做的只是通过溢出缓冲区来调用未定义的行为。此外,如果您可以使用 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

WebDriverException:消息:服务 chromedriver 意外退出。状态码为:3221225477

进程以退出代码 -1073741571 结束

节点递归承诺永远不会退出

抛出异常来强制退出递归有效吗?