Stack overflow - Hilfe
-
Hallo!
Mein Autokick-Programm für Vietcong funktioniert prima, doch wenn ich es über Nacht laufen lasse und in der Früh schaue, sehe ich:
Visual C++ Express: Stack overflow!
Hier der ganze Code:
#ifndef INCLUDED_SLOWBOB #define INCLUDED_SLOWBOB //// < I N C L U D E S > ///////////////////////// #include <windows.h> #include <mmsystem.h> #include <string> #include <sstream> #include <vector> //#include "soci.h" //#include "soci-mysql.h" //// < C L A S S SlowBob > ////////////////////// class SlowBob { HWND hWnd; HWND edit; HWND list; LRESULT itemCount; std::string windowTitle; TCHAR recvText[128]; short oldJoinedPlayers; short joinedPlayers; short reggedPlayers; struct oldJoinedPlayer { std::string ip; std::string id; }; oldJoinedPlayer oldJoinedPlayer[64]; struct joinedPlayer { std::string ip; std::string id; }; joinedPlayer joinedPlayer[64]; struct reggedPlayer { std::string ip; }; reggedPlayer reggedPlayer[1000]; //Session sql; std::vector<std::string> kickList; float current; float elapsed; float old; public: SlowBob(); ~SlowBob(); void Tick(); void Check(); void Kick(); void UpdateOld(); void Clear(); void getItemCount(); void sendText(std::string); void kickPlayer(std::string); void getJoinedPlayers(); void getJoinedPlayerIds(); void getJoinedPlayerIps(); void getReggedPlayerIps(); }; #endif // INCLUDED_SLOWBOB//// < I N C L U D E S > ///////////////////////// #include "SlowBob.h" //// < C L A S S SlowBob > ////////////////////// SlowBob::SlowBob() { windowTitle = "Vietcong v1.60 : BLACK PAJAMAS BLUE LAGUNA |FREE : 5425"; hWnd = FindWindow(0, windowTitle.c_str()); edit = FindWindowEx(hWnd, 0, "Edit", 0); list = FindWindowEx(hWnd, 0, "ListBox", 0); elapsed = 0.0f; old = 0.0f; oldJoinedPlayers = 0; Clear(); } SlowBob::~SlowBob() { ; } void SlowBob::Tick() { current = timeGetTime() / 1000.0f; elapsed += (current - old); old = timeGetTime() / 1000.0f; if(elapsed >= 5.0f) { getJoinedPlayers(); getJoinedPlayerIds(); getJoinedPlayerIps(); getReggedPlayerIps(); Check(); if(kickList.size() > 0) Kick(); UpdateOld(); elapsed = 0.0f; } Sleep(1); } void SlowBob::Check() { for(int a = 0; a < joinedPlayers; a++) { for(int b = 0; b < reggedPlayers; b++) { if(!strcmp(joinedPlayer[a].ip.c_str(), reggedPlayer[b].ip.c_str())) { //if(b == (reggedPlayers - 1)) kickList.push_back(joinedPlayer[a].id); } //else //b = reggedPlayers - 1; } } } void SlowBob::Kick() { sendText("say \"{SlowBob} Clearing kick list\""); Sleep(1000); for(unsigned int a = 0; a < kickList.size(); a++) kickPlayer(kickList[a]); kickList.clear(); } void SlowBob::UpdateOld() { memset(&oldJoinedPlayer, 0, sizeof(oldJoinedPlayer)); for(int a = 0; a < 64; a++) { oldJoinedPlayer[a].ip = joinedPlayer[a].ip; oldJoinedPlayer[a].id = joinedPlayer[a].id; } oldJoinedPlayers = joinedPlayers; memset(&joinedPlayer, 0, sizeof(joinedPlayer)); memset(®gedPlayer, 0, sizeof(reggedPlayer)); memset(&recvText, 0, sizeof(recvText)); } void SlowBob::Clear() { memset(&oldJoinedPlayer, 0, sizeof(oldJoinedPlayer)); memset(&joinedPlayer, 0, sizeof(joinedPlayer)); memset(®gedPlayer, 0, sizeof(reggedPlayer)); memset(&recvText, 0, sizeof(recvText)); } void SlowBob::getItemCount() { itemCount = SendMessage(list, LB_GETCOUNT, 0, 0); } void SlowBob::sendText(std::string text) { SendMessage(edit, WM_SETTEXT, 0, (LPARAM)text.c_str()); SendMessage(edit, WM_KEYDOWN, VK_RETURN, 0); } void SlowBob::kickPlayer(std::string id) { if(id.size() <= 0 || id.find(" ") != std::string::npos) { Clear(); Tick(); } else { sendText("kick " + id); Sleep(200); } } void SlowBob::getJoinedPlayers() { sendText("list"); // Hier trat ein Stack overflow auf! Sleep(1000); getItemCount(); SendMessage(list, LB_GETTEXT, itemCount - 1, (LPARAM)recvText); std::string s = recvText; if(s.size() >= 16) { if(atoi(s.substr(15).c_str()) >= 0 && atoi(s.substr(15).c_str()) <= 64) joinedPlayers = atoi((s.substr(15).c_str())); else { Clear(); Tick(); } } } void SlowBob::getJoinedPlayerIds() { for(int a = 2, b = joinedPlayers - 1; a <= (joinedPlayers + 1), b >= 0; a++, b--) { SendMessage(list, LB_GETTEXT, itemCount - a, (LPARAM)recvText); std::string s = recvText; size_t pos = s.find("]"); if(pos != std::string::npos) { if(s.substr(1, pos - 1).size() <= 4) joinedPlayer[b].id = s.substr(1, pos - 1); else { Clear(); Tick(); } } } } void SlowBob::getJoinedPlayerIps() { for(int a = 0; a < joinedPlayers; a++) { for(int b = 0; b < oldJoinedPlayers; b++) { if(joinedPlayer[a].id == oldJoinedPlayer[b].id) joinedPlayer[a].ip = oldJoinedPlayer[b].ip; } if(strlen(joinedPlayer[a].ip.c_str()) < 7) { sendText("playerip " + joinedPlayer[a].id); Sleep(500); getItemCount(); SendMessage(list, LB_GETTEXT, itemCount - 1, (LPARAM)recvText); std::string s = recvText; if(s.find("failed") != std::string::npos) { sendText("say \"{SlowBob} Could not seek IP. Penalty: Kick\""); Sleep(2000); kickPlayer(joinedPlayer[a].id); Clear(); Tick(); } else if(s.find("error") != std::string::npos) { Clear(); Tick(); } else if(s.find("ip") != std::string::npos) joinedPlayer[a].ip = s.substr(s.find(":") + 2); else { Clear(); Tick(); } } } } void SlowBob::getReggedPlayerIps() { reggedPlayers = 2; reggedPlayer[0].ip = "192.168.0.5"; reggedPlayer[1].ip = "xx.xx.xx.xx"; }Warum passiert da nach Stunden Laufzeit ein Stack overflow?
Danke euch sehr!
-
getJoinedPlayers ruft Tick auf.
Tick ruft getJoinedPlayers auf.
getJoinedPlayers ruft Tick auf.
Tick ruft getJoinedPlayers auf.
getJoinedPlayers ruft Tick auf.
Tick ruft getJoinedPlayers auf.
getJoinedPlayers ruft Tick auf.
Tick ruft getJoinedPlayers auf.
getJoinedPlayers ruft Tick auf.
Tick ruft getJoinedPlayers auf.
getJoinedPlayers ruft Tick auf.
Tick ruft getJoinedPlayers auf.Und so weiter.
-
Aber ich muss es doch so machen, oder? Wenn die Werte nicht stimmen, wird noch mal von Vorn begonnen, also wieder nach Tick().
...
-
Hello schrieb:
Aber ich muss es doch so machen, oder? Wenn die Werte nicht stimmen, wird noch mal von Vorn begonnen, also wieder nach Tick().
Du beginnst nicht "von vorn", sondern startest eine Rekursion. Du startest sozusagen die zweite Runde, bevor die erste vorbei ist. Und du startest die dritte Runde, bevor die zweite vorbei ist. Und da diese Rekursion nie abbricht, ist irgendwann der Stack voll.
-
Aha! Danke, verstehe!
Was bleibt mir nun übrig? Ich denke, ich redesigne alles...
-
Hello schrieb:
Ich denke, ich redesigne alles...
Das würde ich dir empfehlen. Bedenke auch, dass dein Programm nicht objektorientiert wird, nur weil du alles in eine Klasse packst. Da gehört schon etwas mehr dazu.
Deine Strukturen oldJoinedPlayer und joinedPlayer sind identisch. Warum dann überhaupt zwei Strukturen?