Я закодировал оператор 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");
«Я закодировал оператор if, охватывающий несколько тысяч строк» – RyanP
.., но посмотрите на все эти рефакторинги/шаблоны проектирования, скрывающиеся за углом, ожидающие их обнаружения! – stijn
Рунические предложения и код. –