Hier ist ein Code:C++ Stapelüberlauf
void main()
{
GameEngine ge("phil", "anotherguy");
string response;
do {
ge.playGame();
cout << endl << "Do you want to (r)eplay the same battle, (s)tart a new battle, or (q)uit? ";
cin >> response;
} while(response == "r" || response == "R" || response == "s" || response == "S");
}
GameEngine::GameEngine(string name1, string name2)
{
p1Name = name1;
p2Name = name2;
}
void GameEngine::playGame()
{
cout << "PLAY GAME" << endl;
Army p1, p2;
Battlefield testField;
RuleSet rs;
int xSize = 13; // Number of rows
int ySize = 13; // Number of columns
loadData(p1, p2, testField, rs, xSize, ySize);
...
}
void GameEngine::loadData(Army& p1, Army& p2, Battlefield& testField, RuleSet& rs, int& xSize, int& ySize)
{
string terrain = BattlefieldUtils::pickTerrain();
string armySplit[14];//id index 1
string ruleSplit[19];//in index 7
string armyP1, armyP2, ruleSet;
Skill p1Skills[8];
Skill p2Skills[8];
CreatureStack p1Stacks[20];
CreatureStack p2Stacks[20];
...
}
CreatureStack(){quantity = 0; isLive = false; id = -1;};
Army(){};
Battlefield(){};
RuleSet(){};
ich jede Zeile Code geschrieben haben, die bis in die Programmabstürze ausführt. Dieser Code lief für eine lange Zeit gut, ich fügte einige Sachen hinzu, die nicht einmal bis weit nach dem Code ausgeführt werden, den ich hier gepostet habe, und bam, ein Stapelüberlauf, der bei GameEngine::loadData()
Zeile: auftritt, wird nicht verschwinden. Was mache ich hier falsch? Ist das alles, was der Stapel handhaben kann? Ich habe die Stack-Größe in Visual Studio erhöht und den Fehler beseitigt, aber das hat die Dinge erheblich verlangsamt. Wie komme ich also zur Ursache des Problems und behebe es?
Wie groß sind diese Objekte, die Sie auf dem Stapel speichern? (Wie CreatureStack, Battlefield, RuleSet, etc.) –
Sind Sie sicher, dass Sie 'loadData()' (oder 'playGame()') nicht irgendwie rekursiv aufrufen? – sth
Sie sollten einen Debugger verwenden und eine Stapelüberwachung drucken. Das wird Ihnen sagen, ob das Problem eine unendliche Rekursion ist (und was der Aufrufzyklus ist) oder ob die Tiefe der Aufrufe klein ist und das Problem die Menge an Daten ist, die im Stapel selbst gespeichert sind. –