Не удается найти источник ошибки .NET, нужна помощь - PullRequest
0 голосов
/ 28 июня 2011

Я использую .NET Framework 2.0 для программирования 2d-платформера. Я использую SFML .NET, так как он кроссплатформенный, поддерживается MONO и имеет развитый API. Моя проблема в том, что, хотя моя программа правильно компилируется и работает, я получаю сообщение об ошибке при ее закрытии.

Инструкция в "0x5ed0530e" ссылалась на память в "0x0000051c". Память не может быть «прочитана»

После тщательной отладки я заметил, что проблема возникает после инициализации класса SFML String2d.

Что не так; почему эта ошибка возникает при закрытии программы? И даже если все в порядке, можно ли вообще перестать получать ошибку, чтобы пользователи моей программы не раздражались?

с использованием системы; использование SFML.Graphics; использование SFML.Window;

namespace ProGUI
{
    class TextBox : Sprite
    {
        private String2D Text;
        public TextBox(RenderWindow App)
        {
            Image = new Image(App.Width, App.Height / 4, new Color(0, 0, 0));
            Position = new Vector2(0, App.Height - App.Height / 4);
        }

        public void SetText(string text)
        {
            Text = new String2D(text);
            Text.Font = new Font("Greyscale_Basic_Bold.ttf");
            Text.Position = new Vector2(Position.X + 5, Position.Y + 5);
            Text.Size = 12;
        }

        public string GetText()
        {
            return Text.Text;
        }

        public void Render(RenderWindow App)
        {
            App.Draw(this);
            App.Draw(Text);
        }

        public void MainLoop(RenderWindow App, Color clr)
        {
            while (App.IsOpened())
            {
                App.Clear(clr);

                App.DispatchEvents();

                App.Draw(this);
                App.Draw(Text);

                App.Display();
            }
        }
    }
}

Как видите, хитрого кода нет. Абсолютно чисто и просто.

Ответы [ 5 ]

8 голосов
/ 28 июня 2011

Реализует ли класс SFML String2d IDisposable? Вы правильно распределяете все экземпляры?

Возможно, поток финализатора удаляет их, когда они находятся в недопустимом состоянии.

3 голосов
/ 28 июня 2011

Этот код будет бесконечно рекурсивным:

    public void Render(RenderWindow App)
    {
        App.Draw(this);
        App.Draw(Text);
    }

, поскольку App.Draw, вызванный на Sprite x, вызовет x.Render(App).Так что App.Draw(this) будет внутренне звонить this.Render(App).

3 голосов
/ 28 июня 2011

Вам лучше задать этот вопрос на форумах SFML. Быстрый Google обнаружил этот поток , который предполагает, что есть проблема с типом String2D.

1 голос
/ 28 июня 2011

Вы обнаружите, что класс String2d либо:

  • содержит ошибку

, либо (более вероятно, учитывая описание вашей проблемы)

  • Вызывается не в той точке жизненного цикла приложения.

Например, инициализирован ли контейнер для свойства Text в этот момент?Получают ли множественные потоки доступ к свойству Text одновременно (я имею в виду какой-то игровой цикл, в вашем случае)?

Мне, так как это происходит, когда ваше приложение закрывается, яожидайте, что этот SetText метод вызывается во время выключения, после форма / окно было удалено во время выполнения.Если вы установите код для установки this.Text в событии Closed формы, вы получите аналогичные результаты.

1 голос
/ 28 июня 2011

Попробуйте "EditBin.exe / NXCOMPAT: NO C: \ AppName.exe" из командной строки Visual Studio после компиляции приложения.

...