Почему я получаю это исключение переполнения стека? - PullRequest
0 голосов
/ 25 октября 2011

Я пишу клон тетриса, который является самым крупным проектом, который я когда-либо делал. При реализации кода удаления строк я начал получать исключение переполнения стека. Я думаю, это как-то связано с моими огромными коллекциями или ужасно неэффективным использованием Linq. Вот конкретный метод, который вызывает проблему:

void MoveAllAboveDown(int row)
    {
        List<Block> newBlockList = new List<Block>();
        for (int rowCheck = row; rowCheck > _VertOffset; --rowCheck)
        {
            for (int i = _HorizOffset; i < _HorizOffset + _Width; ++i)
            {
                //If the spot above this is filled
                if (_blockList.Where(block => block.Contains(new Vector2(i, rowCheck - 1))).ToList().Count > 0)
                {
                    //insert block here
                    newBlockList.Add(new Block(new Vector2(i, rowCheck), new[,] { { true } }, Color.Black, _texture));
                }
                else
                {
                    var list = _blockList.Where(tempBlock => tempBlock.Contains(new Vector2(i, rowCheck - 1))).ToList();
                    if (list.Count > 0)
                        list.ElementAt(0).Delete(new Vector2(i, rowCheck - 1));
                }
            }
        }
        for (int rowToDelete = row; rowToDelete > _VertOffset; --rowToDelete)
        {
            DeleteRow(rowToDelete);
        }
        foreach (Block block in newBlockList)
        {
            _blockList.Add(block);
        }
    }

Я приложу весь источник, если смогу выяснить, как (даже используя отдельный сайт, если придется).

Если вам так хочется, я бы не стал возражать, если бы кто-то посмотрел на всю кодовую базу и сказал мне, что я пишу и что не так (например, соглашения об именах, алгоритмы и т. Д.). Очевидно, что это не то, для чего предназначен сайт, но я решил добавить это, так как я все равно атакую ​​кодовую базу.

Edit: Вот основной файл игры: http://pastebin.com/PqVAS56U
Вот остальная часть кода: http://pastebin.com/JjBKZgwN

Edit2: Я считаю, что это трассировка стека:

'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Users\Patrick\Desktop\OldComp\Users\patrick\Documents\Visual Studio 2010\Projects\Tetris\Tetris\Tetris\bin\x86\Debug\Tetris.exe', Symbols loaded.
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_32\Microsoft.Xna.Framework.Game\v4.0_4.0.0.0__842cf8be1de50553\Microsoft.Xna.Framework.Game.dll'
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_32\Microsoft.Xna.Framework.Graphics\v4.0_4.0.0.0__842cf8be1de50553\Microsoft.Xna.Framework.Graphics.dll'
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_32\Microsoft.Xna.Framework\v4.0_4.0.0.0__842cf8be1de50553\Microsoft.Xna.Framework.dll'
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.Xna.Framework.Input.Touch\v4.0_4.0.0.0__842cf8be1de50553\Microsoft.Xna.Framework.Input.Touch.dll'
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.Xna.Framework.GamerServices\v4.0_4.0.0.0__842cf8be1de50553\Microsoft.Xna.Framework.GamerServices.dll'
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.

Process is terminated due to StackOverflowException.
The program '[7484] Tetris.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).

Ответы [ 3 ]

5 голосов
/ 25 октября 2011

Не отслеживая остальную часть кода, я подозреваю, что частью этого является использование row вместо rowToDelete в:

for (int rowToDelete = row; rowToDelete > _VertOffset; --rowToDelete)
{
    // DeleteRow(row); // Woops! Typo
    DeleteRow(rowToDelete);
}

Редактировать: если нет, то, скорее всего, в DeleteRow.

3 голосов
/ 25 октября 2011

Я думаю, что причина, по которой вы получаете трассировку стека, заключается в том, что MoveAllAboveDown (int row) вызывает DeleteRow (int row), который вызывает MoveAllAboveDown (int row), создавая бесконечный цикл, как уже указывалось от cornerback84 .

Вот еще пара советов:

  • В вопросе вы отредактировали не трассировку стека , а вывод трассы .
    • Трассировка стека означает распечатку из стека вызовов , которая покажет вложенные выполняемые в настоящее время методы.
    • Чтобы просмотреть стек вызовов, выберите «Отладка»> «Windows»> «Стек вызовов» в меню Visual Studio.
    • Чтобы скопировать стек вызовов для вставки в вопросы, нажмите «Копировать сведения об исключении» в диалоговом окне Помощник по исключениям
  • Поскольку вы просили прокомментировать соглашения об именах и т. Д., Я бы порекомендовал проверить:
3 голосов
/ 25 октября 2011

Я не вижу, как вы уменьшаете значение row, которое вы передаете в MoveAllAboveDown(), а затем в DeleteRow(). Ваша функция DeleteRow() снова вызывает MoveAllAboveDown() с тем же номером row.

Так что они будут звонить друг другу до тех пор, пока StackOverflow.

...