2016-04-04 12 views
2

私は、数千行にまたがるif文をコーディングしました。私はそれをたくさんコメントアウトしないと、スタックオーバーフローエラーが発生します。私はそれがサイズに起因することを知っている。私はこの特定のif文が6つの異なるブロックのコードしか扱えないことが分かったからである[if(mainmenu1.equipment1A)] [if(mainmenu1.player1equipment:& (Player1.job == 1))|| ...ブロック]そして、もし7があっても、どのブロックがコメントアウトされているのかは関係ありません。このコードは、私が取り組んでいるゲームのコードの一部であり、コードはswitch文のまったく異なるgamestateのケースにあり、起動時にこのコードを読み込むべきではありません。コードがコメントアウトされていますが、起動時にはこのエラーが発生しますが、代わりにランタイムエラーにはなりませんか?その場合、プログラムがコードを読み取るまでエラーは発生しません。コード、それはすべて約70,000行ですが、それは繰り返しですので、想像thi SF20.exeの0x103B38B7(ig7icd32.dll)でのファーストチャンス例外:0xC00000FD:スタックオーバーフロー(パラメータ:0x00000000、0x01072000)。 SFML.exeの0x103B38B7(ig7icd32.dll)で処理されない例外:0xC00000FD:スタックオーバーフロー(パラメータ:0x00000000、0x01072000)。なぜ非常に大きなIf文でスタックオーバーフローが発生する

SFML.exeの0x101AC0BE(ig7icd32.dll)での最初の例外:0xC0000005:0x0107091Cのアクセス違反を書き込むアクセス違反。 SFML.exeの0x101AC0BE(ig7icd32.dll)で未処理例外が発生しました。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'文を必要としないように再設計を検討してください。これはOPの最大の問題であると思われます。膨大な、維持不能な、エラーが起こりやすいコピーペーストコードです。 –

+0

@WakeUpToFlatEarth http://gameprogrammingpatterns.com/component.htmlをチェックしてください。申し訳ありませんが投稿を二重にしていますが、質問のコメントスレッドは、ソリューションが提供されていない場合のコードの悪さに関するものです。 – quantumpotato

関連する問題