-2

こんにちは、コンテスト用のゲームを開発して数週間が経ちました。(私はコーディングに少し慣れていますが、それほど多くはありません)。

私はビジュアルC ++でゲームを書いています。Visual C++ でリリース モードで実行すると正常に実行されますが、.exe から実行しようとすると、ウィンドウがポップアップし、" * *.exe が動作を停止しました" と表示されます。エラーの原因はわかっていますが、修正方法がわかりません。多くのベクトルがあるため、エラーがポップアップ表示されます。ゲームを実行するプログラムからサイズ変更するベクトルを削除すると、壁、ボックス ベクトルなど、何でもかまいません。しかし、タスク マネージャーを調べると、ゲームが 20,000K のメモリしか占有しないため、非常に奇妙に感じます。

結論として、ゲームからいくつかのベクトルを削除すると、ゲームの exe が実行されます。そうでない場合は、ビジュアル C++ でのみ実行されます。私は何をすべきか?私は本当に迷っています。

/////////////////////////////////////////////// ///////////////////////////////

ベクトル リストを 4 つだけサイズ変更すると、.exe は実行されますが、4 つ以上のサイズを変更すると、exe でエラーが発生しますが、ビジュアル C++ インスタンスは引き続き実行されます。

class Level
{

public:

    int LevelWidth;
    MapElements::Background Background;

    //OBJETS SUR MAP
    Array<MapElements::Ground> Grounds;
    Array<MapElements::Wall> Walls;
    Array<MapElements::Platform> Platforms;
    Array<MapElements::Box> Boxs;

    //ENNEMIS et JOUEUR
    Array<Gameplay::Droite> Droites;
    Array<Gameplay::Cercle> Cercles;
    Gameplay::Player Player;
};

これは機能します:

 void Level::InitializeMap(int MaxGround, int MaxWall, int MaxPlatforms, int MaxBox)
 {
     Grounds.Element.resize(MaxGround);
     Walls.Element.resize(MaxWall);
     Platforms.Element.resize(MaxPlatforms);
     Boxs.Element.resize(MaxBox);
 }

これはしません:

 void Level::InitializeMap(int MaxGround, int MaxWall, int MaxPlatforms, int MaxBox, int      MaxCercles)
{
    Grounds.Element.resize(MaxGround);
    Walls.Element.resize(MaxWall);
    Platforms.Element.resize(MaxPlatforms);
    Boxs.Element.resize(MaxBox);
    Cercles.Element.resize(MaxCercles);
}

配列クラス:

template <typename T> class Array
{
public:
    std::vector<T> Element;
    Array();

};
template <typename T> Array<T>::Array()
{
}

サイズ変更は、vector.resize() が 4 つしかない場合に機能し、変数 (壁、ボックスなど) のいずれかである可能性があります。エラーの原因は何ですか?

4

3 に答える 3

2

そのエラーの原因についてあなたは間違っています。Windows*.exe has stopped workingで。一般に、アプリケーションがセグメンテーションに失敗したことを意味します。

free()これは、メモリ境界外の読み取りまたは書き込みが原因である可能性があります。これは、通常、 / deletemalloc()/ new、またはどこかを台無しにしたことを意味しますNULLが、コードが増えるか、それ以上の説明がなければ、さらに診断することはできません。

于 2012-07-28T02:23:41.443 に答える
0

vcでゲームを実行する場合、変更していない場合、作業ディレクトリはデフォルトでプロジェクトディレクトリになります。

.exeから実行する場合、作業ディレクトリは.exeが存在するディレクトリです。

したがって、ゲームを直接実行したときに正しく配置できないものに依存しているかどうかを確認できるかもしれません。

于 2012-07-28T02:16:58.783 に答える
0

ベクターの使い方が根本的に間違っています。それに応じてサイズを変更するのではなく、可能な最大サイズにすぐにサイズ変更します。使用可能なメモリをすべて使い果たしている可能性があります。

おそらくこれを行う方が良いでしょう:

class Level
{

public:

    int LevelWidth;
    MapElements::Background Background;

    //OBJETS SUR MAP
    MapElements::Ground Grounds[MAXGROUNDS];
    MapElements::Wall Walls[MAXWALLS];
    MapElements::Platform Platforms[MAXPLATFORMS];
    MapElements::Box Boxs[MAXBOXES];

    //ENNEMIS et JOUEUR
    Array<Gameplay::Droite> Droites;
    Array<Gameplay::Cercle> Cercles;
    Gameplay::Player Player;
};

そして、レベルのメモリを初期化するためにレベルの割り当てに依存します。

今。MaxCercles が何かわかりません。ただし、メモリを使いすぎていないことを確認する必要があります (つまり、それらがすべて MAXINTS である場合、各クラスの大きさによっては少し問題が発生します)。

ベクトルを使用する場合は、デフォルトの中間サイズ (100 など) に設定し、追加したものに基づいてサイズを変更します。

于 2013-03-13T23:51:53.593 に答える