2016-04-04 1 views
2

Я закодировал оператор if, охватывающий несколько тысяч строк, содержащий внутри себя многие другие вложенные операторы if. Я получаю ошибку переполнения стека, когда я не комментирую ее много. Я знаю, что это связано с размером, потому что я обнаружил, что этот конкретный оператор if может обрабатывать только 6 разных блоков кода [блок, в котором говорится «if (mainmenu1.equipment1A)] [их 10 из них (if mainmenu1.player1equipment & & (Player1.job == 1)) || ... block], и неважно, какие блоки не закомментированы, если есть 7 независимо от того, какое 7 оно даст мне следующую ошибку. Странно, однако, Этот код является частью кода в игре, над которой я работаю, и код находится в совершенно другом случае игры в операторе switch, а при запуске этот код не должен читаться. Я не получаю ошибку компиляции при создании без каких-либо кода закомментирован, но при запуске я получаю эту ошибку.Таким образом, это не ошибка времени выполнения? Но в этом случае я не должен получать ошибку до тех пор, пока программа не прочитает код. Я включу образец кода, это всего около 70 000 строк, но это повторяется, поэтому представьте себе с последующим кодовым временем 70.Почему очень большие операторы if вызывают переполнение стека

Исключение из первого шанса в 0x103B38B7 (ig7icd32.dll) в SFML.exe: 0xC00000FD: переполнение стека (параметры: 0x00000000, 0x01072000). Необработанное исключение в 0x103B38B7 (ig7icd32.dll) в SFML.exe: 0xC00000FD: переполнение стека (параметры: 0x00000000, 0x01072000).

Исключение при первой ошибке в 0x101AC0BE (ig7icd32.dll) в файле SFML.exe: 0xC0000005: место записи нарушения доступа 0x0107091C. Необработанное исключение в 0x101AC0BE (ig7icd32.dll) в файле SFML.exe: 0xC0000005: место записи нарушения доступа 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

«Я закодировал оператор if, охватывающий несколько тысяч строк» ​​ – RyanP

+2

.., но посмотрите на все эти рефакторинги/шаблоны проектирования, скрывающиеся за углом, ожидающие их обнаружения! – stijn

+0

Рунические предложения и код.

ответ

7

Технически заявление if не использует пространство для стека.

Вызовы функций в пределах выражения if могут вызывать StackOverflow.

Выделение слишком большого количества локальных переменных в блоке оператора может привести к переполнению стека.

Выделение больших переменных в блоке оператора может привести к переполнению стека.

Рекурсивные функции, которые не ограничены, могут привести к переполнению стека.

Рекурсивные функции, которые используют множество локальных переменных или параметров, могут привести к переполнению стека.

Оператор if обычно оценивается как инструкция сравнения и инструкция ветвления. Эти инструкции не занимают пространство стека.

Ваши ошибки, вероятно, находятся в другом месте.

Используйте отладчик, чтобы найти основную причину.

+1

И рассмотрите редизайн, поэтому вам не нужно массовое количество операторов 'if'. Это, по-видимому, самая большая проблема OPs - огромный, недопустимый и подверженный ошибкам код копирования-вставки. –

+0

@WakeUpToFlatEarth Проверьте http://gameprogrammingpatterns.com/component.html. Извините за двойной пост, но в вопросительной ветке комментариев в основном говорится о том, насколько плохой код без предлагаемого решения. – quantumpotato