2016-05-24 5 views
-1

Я получаю сообщение «Место для обнаружения нарушения доступа 0x007CE4F8» (печать ошибки в конце сообщения) сразу после запуска и выбора места для размещения моего маркера.C++ - Чтение нарушения доступа

Я начинающий программист на C++, так что бы любить, если бы вы могли оставить объяснение максимально простым.

main.cpp

#include <iostream> 
    #include "playGame.h" 

    using namespace std; 

    int main() 
    { 

     playGame game; 
     game.play(); 

     system("PAUSE"); 
     return 0; 
    } 

playGame.cpp

#include "playGame.h" 
#include <iostream> 

using namespace std; 

playGame::playGame() 
{ 
} 

bool playGame::play() 
{ 
    char player1 = 'X'; 
    char player2 = 'O'; 
    bool gameOver = false; 
    int turn = 0; 

    char currentPlayer = player1; 

    clearBoard(); 

    while (gameOver == false) 
    { 
     printBoard(); 

     x = getX(); 
     y = getY(); 

     while (placeMarker(x, y, currentPlayer) == false) 
     { 
      cout << "***Place already taken!***" << endl; 
      x = getX(); 
      y = getY(); 
     } 
      turn++; 

    } 
    return gameOver; 
} 

void playGame::clearBoard() 
{ 
    for (int i = 0; i < 3; i++) 
    { 
     for (int j = 0; j < 3; j++) 
     { 
      board[i][j] = ' '; 
     } 
    } 
} 

void playGame::printBoard() 
{ 
    cout << endl; 
    cout << " |1 2 3|\n"; 
    for (int i = 0; i < 3; i++) { 
     cout << " -------\n"; 
     cout << i + 1 << "|" << board[i][0] << "|" << board[i][1] << "|" << board[i][2] << "|\n"; 
    } 
    cout << " -------\n"; 
} 

int playGame::getX() 
{ 
    while ((x < 1) || (x > 3)) { 
     cout << "Choose X coordinate (1 - 3): "; 
     cin >> x; 
     if ((x < 1) || (x > 3)) 
     { 
      cout << "Bad input" << endl; 
     } 
     else 
     { 
      x--; 
      return x; 
     } 
    } 

} 

int playGame::getY() 
{ 
    while ((y < 1) || (y > 3)) { 
     cout << "Choose Y coordinate (1 - 3): "; 
     cin >> y; 
     if ((y < 1) || (y > 3)) 
     { 
      cout << "Bad input" << endl; 
     } 
     else 
     { 
      y--; 
      return y; 
     } 
    } 
} 

bool playGame::placeMarker(int x, int y, char currentPlayer) 
{ 
    if (board[y][x] != ' ') 
    { 
     return false; 
    } 
     board[y][x] = currentPlayer; 
     return true; 
} 

playGame.h

#pragma once 
#include <iostream> 

using namespace std; 

class playGame 
{ 
public: 
    playGame(); 
    bool play(); 

private: 
    void clearBoard(); 
    void printBoard(); 
    int getX(); 
    int getY(); 
    bool placeMarker(int x, int y, char currentPlayer); 

    char board[3][3]; 
    int x, y; 

}; 

Проводка печати, если делает вашу жизнь лучше: Image of the error

+4

ли вы попробовать использовать отладчик? –

+0

@ AlgirdasPreidžius - это то, что вы ищете? https://gyazo.com/598464751102694f68a9d6b62ca24d99 также он дает мне 0 ошибок 0 предупреждений –

+0

Нет, я не ищу выход вашей компиляции. Я спрашиваю, пытались ли вы использовать отладчик, чтобы найти проблему самостоятельно. Поскольку этот «вопрос» не показывает попыток решить проблему самостоятельно, скорее выглядит как «вот код - отлаживайте его для меня». –

ответ

2

Я вижу несколько проблем:

  1. Вы не инициализируются переменные-члены playGame в конструкторе. Использование значений неинициализированных переменных-членов является причиной неопределенного поведения.

  2. У вас нет заявления return во всех филиалах getX() и getY(). Это является причиной неопределенного поведения.

Обновить конструктор, чтобы иметь разумные начальные значения.

playGame::playGame() : x(0), y(0) 
{ 
    for (int i = 0; i < 3; ++i) 
    { 
     for (int j = 0; j < 3; ++j) 
     { 
     board[i][j] = ' '; 
     } 
    } 
} 

Update getX() к:

int playGame::getX() 
{ 
    // Make x invalid before starting the while loop. 
    // Otherwise, the last valid value will be returned. 
    x = 0; 
    while ((x < 1) || (x > 3)) 
    { 
     cout << "Choose X coordinate (1 - 3): "; 
     cin >> x; 
     if ((x < 1) || (x > 3)) 
     { 
     cout << "Bad input" << endl; 
     } 
    } 

    x--; 
    return x; 
} 

Update getY() аналогично.

0

Инициализировать x и y, например. 0 в конструкторе (что-то вне диапазона 1-3) и сбросить их до 0 после размещения маркера.

0

Я не знаю, может ли это объяснить вашу проблему, но в вашем коде я вижу вещь, которую я нашел немного странной.

Вы определяете x и y в качестве членов класса playGame.

Так что, когда в play() вы пишете

x = getX(); 
    y = getY(); 

и в getX() и getY() вы пишете

return x; 

и

return y; 

вы копируете элемент x в член x т hore getX() и член y член y через getY().

Предложение: удалить x и y членов из playGame класса и определяют x и y как локальные переменные в методах.

0

Защитите вашу функцию placeMarker, чтобы быть уверенным, что ваш не выходит за границы при доступе в массив, то есть:

if(x > MAX_X || x< MIN_X) return false; 
if(y > MAX_Y || y< MIN_Y) return false; 
Смежные вопросы