C ++ - 访问冲突读取

时间:2016-05-24 13:14:55

标签: c++

我得到一个"访问冲突读取位置0x007CE4F8"在运行并选择放置标记的位置后,(在帖子末尾打印错误)

我是一名初学者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 :(得分:2)

我看到了几个问题:

  1. 您尚未在构造函数中初始化myList <- foreach(i =1:4, .packages = "NMF") %dopar%{ 的成员变量。使用未初始化成员变量的值是未定义行为的原因。

  2. 您在playGamereturn的所有分支中都没有getX()语句。这是未定义行为的原因。

  3. 更新构造函数以获得合理的初始值。

    getY()

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

    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; }

答案 1 :(得分:0)

将x和y初始化为例如构造函数中的0(范围1-3之外的东西),并在放置标记后将它们重置为0。

答案 2 :(得分:0)

我不知道这是否可以解释您的问题,但在您的代码中,我发现了一件我发现有点奇怪的事情。

您将xy定义为playGame类的成员。

所以,当你在play()写下

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

并在getX()getY()中写下

    return x;

    return y;

您正在成员x中通过x和成员getX()通过y通过y复制成员getY()

建议:从x类中删除yplayGame成员,并将xy定义为方法中的局部变量。

答案 3 :(得分:0)

保护您的功能placeMarker以确保在您访问阵列时不会超出范围,即:

if(x > MAX_X || x< MIN_X) return false;
if(y > MAX_Y || y< MIN_Y) return false;