繁体   English   中英

我正在制作一个控制台应用程序游戏 (C#),但我遇到了堆栈溢出错误。 如何避免?

[英]I'm making a Console Application Game (C#), and I'm running into Stack Overflow Error. How to avoid?

我的游戏对游戏的每个状态都有多种方法,这些方法在适用的情况下相互调用。 这会在一段时间后导致堆栈溢出错误。 有什么办法可以避免这种情况,也许是一种解决方法?

编辑:由于下面的用户建议我的代码基本上是:

void a()
{
    b();
}

void b()
{
    a();
}

在这段代码中,我打算使用递归来改变游戏状态。 有没有办法重置堆栈,这样它就不会导致溢出错误,然后返回到方法。

可能的修复:(这只是延迟了堆栈溢出还是已经摆脱了它?)

int tracker;
void start()
{
    a();
    resetter();
}

void a()
{
    b();
}

void b()
{
    if (tracker > 10)
    {
        tracker = 0;
        return;
    }
    else
        tracker++;
    a();
}

void resetter()
{
    start();
}

我假设你正在做这样的事情:

void A()
{
  B();
}
void B()
{
  A();
}

根据定义,这将始终导致堆栈溢出。 这主要是因为堆栈的工作方式。 假设您先调用A ,在此方法调用B的那一刻,此方法的参数/变量/... 被放入堆栈中。 然后,此方法 ( B ) 调用“A”; 发生这种情况的那一刻,它将把它的参数放在堆栈上。

方法返回后,堆栈上的数据被清除。 但这两种方法永远不会返回......它们不断地相互调用,例如:

A()
  --> B()
    --> A()
      --> B()
        --> A()
          --> B()
            --> A()
              --> B()
               --> A()

如您所见,越来越多的东西被放入堆栈,导致您的溢出。

你会希望你的递归停止来解决这个问题。 您可以通过在任一方法中引入停止条件来实现此目的,该条件将return

如果您希望更具体地回答您的问题,请添加一些代码。 但是既然你说的是A调用B,也就是调用A,那么上面的伪代码就足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM