2016-04-04 5 views
2

Ich habe eine if-Anweisung für einige tausend Zeilen codiert, die viele andere verschachtelte if-Anweisungen enthält. Ich bekomme einen Stack-Overflow-Fehler, wenn ich nicht viel auskommentiere. Ich weiß, dass es um Größe wegen, weil ich, dass diese besondere gefunden if-Anweisung nur 6 verschiedene Codeblöcke verarbeiten kann [der Block, der sagt: „if (mainmenu1.equipment1A)] [es gibt 10 davon pro if ((mainmenu1.player1equipment & & (Player1.job == 1)) || ... block] und es spielt keine Rolle, welche Blöcke nicht auskommentiert sind, wenn es 7 gibt, egal welche 7 es mir diesen folgenden Fehler geben wird. Dieser Code ist Teil des Codes in einem Spiel, an dem ich gerade arbeite, und der Code befindet sich in einer switch-Anweisung in einem völlig anderen Gamestate-Fall, und beim Start sollte dieser Code nicht gelesen werden, ich erhalte beim Kompilieren keinen Fehler der Code auskommentiert, aber beim Start bekomme ich diesen Fehler.Schreibe es nicht ein Laufzeitfehler stattdessen? Aber in diesem Fall sollte ich nicht den Fehler bekommen, bis das Programm den Code liest. Ich werde ein Beispiel der Code, es ist etwa 70.000 Zeilen in allen, aber es ist repetitiv, so stellen Sie sich vor s folgenden Code mal 70.Warum verursachen sehr große If-Anweisungen einen Stapelüberlauf

Erste-Chance-Ausnahme bei 0x103B38B7 (ig7icd32.dll) in SFML.exe: 0xC00000FD: Stack-Überlauf (Parameter: 0x00000000, 0x01072000). Unbehandelte Ausnahme bei 0x103B38B7 (ig7icd32.dll) in SFML.exe: 0xC00000FD: Stapelüberlauf (Parameter: 0x00000000, 0x01072000).

Erste-Chance-Ausnahme bei 0x101AC0BE (ig7icd32.dll) in SFML.exe: 0xC0000005: Zugriffsverletzung Schreibort 0x0107091C. Nicht behandelte Ausnahme bei 0x101AC0BE (ig7icd32.dll) in SFML.exe: 0xC0000005: Zugriffsverletzung Schreibort 0x0107091C.

//equipment text 
    if (mainmenu1.equipmentmenu2) 
    { 
     if (executeequipmenttextonce) 
     { 
      executeequipmenttextonce = false; 

      if (mainmenu1.rightselected) 
      { 
      if ((mainmenu1.player1equipment && (Player1.job == 1)) || (mainmenu1.player2equipment && (Player2.job == 1)) || (mainmenu1.player3equipment && (Player3.job == 1))) 
      { 
       if (mainmenu1.equipment1A) 
       { 
        if (!mainmenu1.knightweapon1displayed && mainmenu1.knightweapon1) 
        { 
         mainmenu1.equipment1A = false; 
         mainmenu1.knightweapon1displayed = true; 
         textDisplay16.text.setString("Broadsword"); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
         textDisplay16.text.setString(to_string(mainmenu1.knightw1)); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1 + equipmentstockpositionx, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
        } 
        else if (!mainmenu1.knightweapon2displayed && mainmenu1.knightweapon2) 
        { 
         mainmenu1.equipment1A = false; 
         mainmenu1.knightweapon2displayed = true; 
         textDisplay16.text.setString("Ea"); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
         textDisplay16.text.setString(to_string(mainmenu1.knightw2)); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1 + equipmentstockpositionx, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
        } 
        else if (!mainmenu1.knightweapon3displayed && mainmenu1.knightweapon3) 
        { 
         mainmenu1.equipment1A = false; 
         mainmenu1.knightweapon3displayed = true; 
         textDisplay16.text.setString("Zangetsu"); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
         textDisplay16.text.setString(to_string(mainmenu1.knightw3)); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1 + equipmentstockpositionx, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
        } 
        else if (!mainmenu1.knightweapon4displayed && mainmenu1.knightweapon4) 
        { 
         mainmenu1.equipment1A = false; 
         mainmenu1.knightweapon4displayed = true; 
         textDisplay16.text.setString("Silver Fleurette"); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
         textDisplay16.text.setString(to_string(mainmenu1.knightw4)); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1 + equipmentstockpositionx, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
        } 
        else if (!mainmenu1.knightweapon5displayed && mainmenu1.knightweapon5) 
        { 
         mainmenu1.equipment1A = false; 
         mainmenu1.knightweapon5displayed = true; 
         textDisplay16.text.setString("Lawliet"); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
         textDisplay16.text.setString(to_string(mainmenu1.knightw5)); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1 + equipmentstockpositionx, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
        } 
        else if (!mainmenu1.knightweapon6displayed && mainmenu1.knightweapon6) 
        { 
         mainmenu1.equipment1A = false; 
         mainmenu1.knightweapon6displayed = true; 
         textDisplay16.text.setString("Luminous Edge"); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
         textDisplay16.text.setString(to_string(mainmenu1.knightw6)); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1 + equipmentstockpositionx, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
        } 
        else if (!mainmenu1.knightweapon7displayed && mainmenu1.knightweapon7) 
        { 
         mainmenu1.equipment1A = false; 
         mainmenu1.knightweapon7displayed = true; 
         textDisplay16.text.setString("Heaven's Saber"); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
         textDisplay16.text.setString(to_string(mainmenu1.knightw7)); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1 + equipmentstockpositionx, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
        } 
        else if (!mainmenu1.knightweapon8displayed && mainmenu1.knightweapon8) 
        { 
         mainmenu1.equipment1A = false; 
         mainmenu1.knightweapon8displayed = true; 
         textDisplay16.text.setString("Crystal Edge"); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
         textDisplay16.text.setString(to_string(mainmenu1.knightw8)); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1 + equipmentstockpositionx, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
        } 
        else if (!mainmenu1.knightweapon9displayed && mainmenu1.knightweapon9) 
        { 
         mainmenu1.equipment1A = false; 
         mainmenu1.knightweapon9displayed = true; 
         textDisplay16.text.setString("Triple Zoro"); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
         textDisplay16.text.setString(to_string(mainmenu1.knightw9)); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1 + equipmentstockpositionx, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
        } 
        else if (!mainmenu1.knightweapon10displayed && mainmenu1.knightweapon10) 
        { 
         mainmenu1.equipment1A = false; 
         mainmenu1.knightweapon10displayed = true; 
         textDisplay16.text.setString("Elsword"); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
         textDisplay16.text.setString(to_string(mainmenu1.knightw10)); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1 + equipmentstockpositionx, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY1); 
         textDisplayArray16.push_back(textDisplay16); 
        } 
       } 
       else if (mainmenu1.equipment2A) 
       { 
        if (!mainmenu1.knightweapon1displayed && mainmenu1.knightweapon1) 
        { 
         mainmenu1.equipment2A = false; 
         mainmenu1.knightweapon1displayed = true; 
         textDisplay16.text.setString("Broadsword"); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY2); 
         textDisplayArray16.push_back(textDisplay16); 
         textDisplay16.text.setString(to_string(mainmenu1.knightw1)); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1 + equipmentstockpositionx, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY2); 
         textDisplayArray16.push_back(textDisplay16); 
        } 
        else if (!mainmenu1.knightweapon2displayed && mainmenu1.knightweapon2) 
        { 
         mainmenu1.equipment2A = false; 
         mainmenu1.knightweapon2displayed = true; 
         textDisplay16.text.setString("Ea"); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY2); 
         textDisplayArray16.push_back(textDisplay16); 
         textDisplay16.text.setString(to_string(mainmenu1.knightw2)); 
         textDisplay16.text.setPosition(view1.getCenter().x - window.getSize().x/2 + equipmentPositionX1 + equipmentstockpositionx, view1.getCenter().y - window.getSize().y/2 + equipmentPositionY2); 
         textDisplayArray16.push_back(textDisplay16); 
        } 
        else if (!mainmenu1.knightweapon3displayed && mainmenu1.knightweapon3) 
        { 
         mainmenu1.equipment2A = false; 
         mainmenu1.knightweapon3displayed = true; 
         textDisplay16.text.setString("Zangetsu"); 
+11

"Ich habe eine if-Anweisung geschrieben, die ein paar tausend Zeilen umfasst" – RyanP

+2

..aber schau dir all diese Refactorings/Designmuster an, die gleich um die Ecke lauern und darauf warten, entdeckt zu werden! – stijn

+0

Runon-Sätze und Runon-Code.

Antwort

7

Technisch betrachtet verbraucht eine if-Anweisung keinen Stapelspeicherplatz.

Funktionsaufrufe innerhalb eines if Expression kann ein Stackoverflow verursachen.

Zuweisung zu vielen lokalen Variablen im Anweisungsblock können einen Stapelüberlauf verursachen.

große Variablen in dem Anweisungsblock Allokierung kann einen Stapelüberlauf verursachen.

Rekursive Funktionen, die nicht begrenzt sind, können einen Stapelüberlauf verursachen.

rekursive Funktionen, die eine Menge von lokalen Variablen oder Parameter verwenden kann, um einen Stapel-Überlauf verursachen.

Eine if Anweisung wird als Vergleichsbefehl und eine Sprunganweisung im Allgemeinen ausgewertet. Diese Anweisungen belegen keinen Stapelspeicherplatz.

Ihre Fehler sind wahrscheinlich woanders.

Verwenden Sie einen Debugger, um die Ursache zu finden.

+1

Und betrachten Sie ein Redesign, so dass Sie nicht eine große Menge von 'if' Anweisungen benötigen. Das scheint das größte Problem von OP zu sein - riesiger, nicht wartbarer und fehleranfälliger Copy-Paste-Code. –

+0

@WakeUpToFlatEarth Überprüfen Sie http://gameprogrammingpatterns.com/component.html. Es tut uns leid, einen Doppelpost zu schreiben, aber der Fragekommentar Thread ist hauptsächlich darüber, wie schlecht der Code ohne eine angebotene Lösung ist. – quantumpotato

Verwandte Themen