2016-09-09 5 views
1

私はうまく動作するチック・タック・トー・ゲームを作りました。最近私はリセットゲーム機能を追加することにしました。 はここで、私がデバッグモードでは、プログラムはデバッグで正常に動作しますが、リリースでは動作しません

void playerMove() //Gets the player move and updates the box variables 
{ 
    int boxnumber; 
    while(1)  //Set's loop if the player enters a invalid input 
    { 
     cout << "\n Player " << player << "'s turn!(Press 0 to reset the game!): "; 
     cin >> boxnumber; 
     if(box[boxnumber-1] == 'X' || box[boxnumber-1] == 'O' || boxnumber > 9 || boxnumber < 0) // Checks if the input is valid or not 
     { 
      system("CLS");//If invalid, show error and loop back to start to get new input 
      displayBoard(); 
      cout << "\n Invalid Input! Try again!\n"; 

     }else if(boxnumber == 0) 
     { 
      refreshGame(); 
      displayBoard(); 
     }else 
     { 
      box[boxnumber-1] = player;//If inputs are fine, set the box variable's and break out of loop! 
      break; 
     } 
    } 

} 

今、ユーザからの入力を取る部分であり、私は0を押すと、すべてが正常に実行され、ゲームがリセットされ、私は0を押したときにリリースビルドでは、それが与えます私は "入力が無効です!もう一度やり直してください!"

私はdidntの仕事を試したことがあります: - リリース全体をデバッグし、バージョンをデバッグしてください。 - 新しいプロジェクトを作成し、自分のコードをコピーして貼り付けます。同じこと、デバッグの動作、リリースのdoesnt。

不思議なことに、私はcode :: blocks IDEを使用しています。コンパイラはGNU GCCです。 助けてくれてありがとう! :)

+0

を私はあなたが箱を得ることができるとは思わない[-1] –

+1

'boxnumber-1 'が起こっています'0 'を入力すると' box [boxnumber-1] 'に入りますか? – NathanOliver

答えて

3

ifステートメントでは、範囲チェックを値チェックの前に置いてください。入力値が値のチェックは実行されない0未満又は9より大きい場合:すなわち、短絡を利用する

if(boxnumber < 0 || box number > 9 || box[boxnumber-1] == 'X' || box[boxnumber-1] == 'O') 

if(box[boxnumber-1] == 'X' || box[boxnumber-1] == 'O' || boxnumber > 9 || boxnumber < 0) 

を変更しています。これは、有効でないbox[10]のようなものをチェックすることを避けるでしょう。

まだ問題はありません。ユーザーが0を入力すると、このコードはうれしくbox[-1]をチェックします。これも範囲外です。この取り除くために、この部分の前でbox number == 0をテストif文のブランチに移動:

if (box number == 0) 
    // whatever 
else if (box[boxnumber-1] == 'X' || box[boxnumber-1] == 'O' || boxnumber > 9 || boxnumber < 0) 
    // whatever else 
+0

これは大きな修正です。このように考えることは決してありません。あなたの助けをありがとう:) – JohnMorris11

+0

@ JohnMorris11 - 別の提案:ユーザーから値を取得した後、許容値が0から8になるように減らしてください。これにより、配列アクセスのすべての '-1 'が削除されます。 –

4

あなたはの定義されていない動作です。あなたは(あなたがあなたの質問に述べたように)0を入力するときに、あなたはインデックス-1で要素にアクセスしようとしている、box[boxnumber-1]を持っているif「最初」で

。それはあなたが "無効な"メモリを読んでいるので、UBです。

最初に0(および負の数も)を確認する必要があります。

+0

答えをありがとう。デバッグでは動作しますが、リリースでは動作しない理由は何ですか? – JohnMorris11

+0

@ JohnMorris11 - "未定義の動作"のため生成されたコードは両方のモードで異なり、メモリのレイアウトも異なります。したがって、その動作は異なる場合もあります。 –

+3

実際にはまだ有効な結果が得られているかもしれないので、単なる事故で – deW1

関連する問題