2016-04-04 33 views
2

İçerideki ifadeler varsa iç içe geçmiş birkaç satır içeren bir if ifadesi kodluyorum. Çok fazla yorumlamadığımda yığın taşması hatası alıyorum. Boyutu nedeniyle biliyorum çünkü bu özel if ifadesinin yalnızca 6 farklı kod bloğunu işleyebileceğini buldum [blok (eğer mainmenu1.equipment1A] yazıyorsa) [bunlardan 10 tane tane varsa] ((mainmenu1.player1equipment & &) (Player1.job == 1)) || ... block] ve 7 tane olursa olsun hangi blokların yorumlanmamış olduğu önemli değil. Bu kod, üzerinde çalıştığım bir oyundaki kodun bir parçasıdır ve kod, bir anahtar deyiminde tamamen farklı bir gametate durumundadır ve başlangıçta bu kod okunmamalıdır. Hiçbiri ile birlikte oluşturma sırasında bir derleme hatası almıyorum kod, ancak başlangıçta bu hatayı aldım.Ama bunun yerine bir çalışma zamanı hatası değil mi? Ama bu durumda, program kodu okur kadar hata almam gerekir.O bir örnek içerecektir kod, bu yaklaşık 70.000 satırdır ama tekrarlayan bir şeydir. Aşağıdaki kod zamanları 70.Neden çok büyük If ifadeleri bir yığın taşmasına neden oluyorsa

SFML.exe dosyasında 0x103B38B7 (ig7icd32.dll) de ilk şans istisnası: 0xC00000FD: Yığın taşması (parameters: 0x00000000, 0x01072000). SFML.exe içinde 0x103B38B7 (ig7icd32.dll) işlenmeyen özel durum: 0xC00000FD: Yığın taşması (parametreler: 0x00000000, 0x01072000).

SFML.exe içinde 0x101AC0BE (ig7icd32.dll) de ilk şans istisnası: 0xC0000005: Erişim ihlali yazma konumu 0x0107091C. SFML.exe içinde 0x101AC0BE (ig7icd32.dll) işlenmeyen özel durum: 0xC0000005: Erişim ihlali yazma konumu 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

"Birkaç bin satırlık bir if deyimi kodladım" – RyanP

+2

.. ama köşede gizlenen tüm bu refactorings/tasarım desenlerine bakın, keşfedilmeyi bekliyor! – stijn

+0

Runon cümleleri ve runon kodu.

cevap

7

Teknik olarak bir if deyimi yığın alanı tüketmez.

Bir if ifadesindeki işlev çağrıları StackOverflow'a neden olabilir.

İfade bloğundaki çok fazla yerel değişkenin tahsis edilmesi yığın taşmasına neden olabilir.

İfade bloğundaki büyük değişkenlerin tahsis edilmesi yığın taşmasına neden olabilir.

Sınırlı olmayan yinelemeli işlevler yığın taşmasına neden olabilir.

Çok sayıda yerel değişken veya parametre kullanan özyinelemeli fonksiyonlar yığın taşmasına neden olabilir. Bir if ifadesi genellikle bir karşılaştırma talimatı ve bir dal bildirgesi olarak değerlendirilir. Bu talimatlar yığın alanı işgal etmiyor.

Hatalarınız muhtemelen başka bir yerde bulunmaktadır.

Kök nedenini bulmak için bir hata ayıklayıcısını kullanın.

+1

'da ilginizi çekebilir ve yeniden tasarlamayı düşünebilirsiniz, böylece çok fazla "if" ifadesine ihtiyacınız yoktur. Bu OP'lerin en büyük sorunu - büyük, sürdürülemez ve hata eğilimli kopyala-yapıştır kodu gibi görünüyor. –

+0

@WakeUpToFlatEarth http://gameprogrammingpatterns.com/component.html adresini ziyaret edin. Çifte posta için üzgünüm ama soru yorum iş parçacığı çoğunlukla kodun çözümün ne kadar kötü olduğu hakkında. – quantumpotato