2012-07-28 110 views
-2

嗨工作它已經幾個星期進出口深化發展遊戲的比賽。 (我很熟悉編碼,但不是很多)。C++遊戲exe文件停止工作,很多課。在Visual C++

我正在寫在Visual C++遊戲。當我在視覺c釋放模式下運行它++,它運行正常,但是當我從.exe嘗試,會彈出一個窗口,並說:「*的* .exe已停止工作」。我知道錯誤是什麼,但我不知道如何解決。彈出的錯誤是因爲有很多矢量,如果我刪除了一些從遊戲運行的程序調整大小的矢量,它可以是任意的,牆壁,矢量,沒關係。但是我覺得這很奇怪,因爲當我在任務管理器中查找時,遊戲僅佔用2萬個內存。

所以在最後,如果我從遊戲中刪除一些載體,遊戲的EXE運行,如果沒有,那就只能在Visual C++運行。我該怎麼辦?我真的迷失了。

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

確定,如果我調整隻有四個向量列表中, .exe會運行,但如果我調整大於4,exe文件會給出錯誤,但Visual 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); 
} 

Array類:

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

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

調整尺寸作品,如果我只有4載體。 resize(),它可以是任何變量(牆,框等),w帽子是錯誤的來源?

+0

你是如何編譯exe文件的? 16位模式?除非你以有限的方式建造,否則對班級數量沒有限制。 – stark 2012-07-28 02:14:34

+0

我的猜測是在運行時需要一個文件,這個文件在運行時可以在Visual Studio中運行,但在運行exe時不會運行。遊戲在可執行文件所在的目錄中是否需要所有資源? – ctor 2012-07-28 02:15:31

+0

哇爲什麼倒票?不,沒有任何丟失的文件,我知道對類沒有限制,但我會看看編譯。 – user1236892 2012-07-28 17:48:40

回答

2

你錯了關於是什麼導致了這個錯誤。在窗口*.exe has stopped working。通常意味着您的應用程序有segmentation faulted

這可以通過任何讀取所引起,或者寫出來的存儲器的邊界,這通常意味着你有free()/delete弄亂的,一個malloc()/newNULL某處,但隨着更多的代碼,或不進行進一步的解釋,我無法進一步診斷。

+0

謝謝!我沒有使用任何這些,所以我搞砸了很多東西......我發現了一篇關於如何使用它們的文章,所以我會試試看。但它是正常的,它在Visual C++中運行正常,而不是在exe中?它仍然是相同的計劃嗎?他們兩個之間有什麼區別? – user1236892 2012-07-28 03:41:10

+0

更新了主要問題。 – user1236892 2012-07-29 17:37:11

0

當您運行在vc遊戲,工作目錄默認爲項目目錄,如果你沒有改變它。

當您從.exe文件運行它,工作目錄是.exe文件所在的目錄。

所以也許你可以,如果你的遊戲依賴於一些東西,不能正確,當你位於檢查直接運行。

+0

我很確定所有的Dll和圖形都在那裏。我的問題與此有關係嗎? http://stackoverflow.com/questions/1763739/problem-retuning-a-vector-from-ac-dll-to-another-c-exe – user1236892 2012-07-29 17:36:37

+0

@ user1236892,是否有可能您的程序過度使用堆棧並導致堆棧溢出?默認的堆棧大小應該是1MB,當程序在ide中運行時,預留的堆棧大小可能會更大。 – 2012-07-31 05:15:59

0

您從根本上錯誤地使用了Vector。您立即將它們調整到可能的最大尺寸,而不是讓它們相應調整大小。你可能已經把你所有的可用內存都吹走了。

它可能是更好地做到這一點:

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或者其他),並讓它們根據您添加的內容調整大小。