-6

.NET Framework 2.0 を使用して 2D プラットフォーマーをプログラミングしています。私は SFML .NET を使用しています。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();
            }
        }
    }
}

ご覧のとおり、危険なコードはありません。絶対にクリーンでシンプル。

4

5 に答える 5

8

SFML String2d クラスは IDisposable を実装していますか? すべてのインスタンスを正しく破棄していますか?

それらが無効な状態にあるときに、ファイナライザー スレッドがそれらを破棄している可能性があります。

于 2011-06-28T16:59:16.060 に答える
3

このコードは無限に再帰します:

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

App.Drawで呼び出されるのでSprite x、を呼び出しますx.Render(App)。したがって、App.Draw(this)内部的にを呼び出しますthis.Render(App)

于 2011-06-28T18:17:35.233 に答える
3

SFML フォーラムでこの質問をしたほうがよいでしょう。簡単な Google がこのスレッドを見つけました。これは、String2D 型に問題があることを示唆しています。

于 2011-06-28T17:45:54.267 に答える
1

String2dクラスが次のいずれかであることがわかります。

  • バグあり

または(おそらく、問題の説明を考えると)

  • アプリのライフサイクルの間違った時点で呼び出されています。

たとえば、Textプロパティのコンテナはこの時点で初期化されていますか? 複数のスレッドTextが同時にプロパティにアクセスしていますか (あなたの場合、ある種のゲームループを考えています)?

私には、これはアプリが閉じているときに発生するため、フォーム/ウィンドウがランタイムによって破棄されたSetText、シャットダウン中にこのメソッドが呼び出されると予想されます。フォームのイベントにコードを設定すると、同様の結果が得られます。this.TextClosed

于 2011-06-28T17:05:45.283 に答える
1

アプリをコンパイルした後、ビジュアル スタジオのコマンド ラインから "EditBin.exe /NXCOMPAT:NO C:\AppName.exe" を試してください。

于 2011-06-28T17:01:16.170 に答える