Переполнение буфера в C ++

Я изучаю C ++ и, хотя у меня есть разумное понимание C #, я никогда раньше не сталкивался с этой проблемой. С помощью простой программы, которая помещает шахматные фигуры на воображаемую доску (нумерованный массив) и затем назначает квадраты, которые будут иметь фигуры в начале их фигур, вас затем спрашивают о координатах, и программа возвращает то, что находится на этом квадрате. Он отображает правильный фрагмент, но всегда будет аварийно завершать работу в режиме без отладки и отображать переполнение буфера в отладке Visual Studio. Это довольно короткий, поэтому я покажу весь код.

#include <iostream>
#include <string>
using namespace std;
int main() {
enum Chessboard {
Blank,
Pawn,
Rook,
Knight,
Bishop,
King,
Queen
};
Chessboard board[8][8] = { Blank };
for (int x = 1; x < 8; x++)
{
board[1][x] = Pawn;
board[8][x] = Pawn;
}
board[7][0] = Rook;
board[7][1] = Knight;
board[7][2] = Bishop;
board[7][3] = King;
board[7][4] = Queen;
board[7][5] = Bishop;
board[7][6] = Knight;
board[7][7] = Rook;
board[0][0] = Rook;
board[0][1] = Knight;
board[0][2] = Bishop;
board[0][4] = King;
board[0][3] = Queen;
board[0][5] = Bishop;
board[0][6] = Knight;
board[0][7] = Rook;

int X = 0;
int Y = 0;
bool Error = false;
cout << "Enter the coordinates of a square on a chessboard to see what is on there at    the start of the game (1 number at a time)" << endl;
do {
cin >> X;
X--;
Error = false;
if (X < 0 || X > 7)
{
cout << "That's not on the board" << endl;
Error = true;
}
} while (Error = false);
do {
cin >> Y;
Y--;
Error = false;
if (Y < 0 || Y > 7)
{
cout << "That's not on the board" << endl;
Error = true;
}
} while (Error = false);

string Name = "";
Chessboard Piece = board[X][Y];
switch (Piece)
{
case Blank: Name = "nothing";
break;
case Pawn: Name = "a Pawn";
break;
case Rook: Name = "a Rook";
break;
case Knight: Name = "a Knight";
break;
case Bishop: Name = "a Bishop";
break;
case King: Name = "a King";
break;
case Queen: Name = "a Queen";
break;
default: Name = "Somehow you missed the board";
break;
}

cout << "On " << ++X << "," << ++Y << " there is " << Name << endl;

return 0;
}

0

Решение

Вы наверняка получите переполнение здесь:

Chessboard board[8][8] = { Blank };
for (int x = 1; x < 8; x++)
{
board[1][x] = Pawn;
board[8][x] = Pawn;
}

Нет никаких board[8][], У тебя есть board[0][] через board[7][] имеется в наличии.

2

Другие решения

Вы выходите за пределы своей матрицы

   board[1][x] = Pawn;
board[8][x] = Pawn;

Вы объявили это 8×8, поэтому следует использовать индекс 0..7.

2

В C, C ++ и C # индексы массивов начинаются с 0 до размера массива — 1. Так, например, этот цикл

for (int x = 1; x < 8; x++)
{
board[1][x] = Pawn;
board[8][x] = Pawn;
}

должен быть переписан как

for ( int x = 0; x < 8; x++)
{
board[1][x] = Pawn;
board[6][x] = Pawn;
}

при условии, что массив определен как

Chessboard board[8][8] = { Blank };

Также было бы неплохо ввести мнемоническое имя для магического числа 8 и использовать это имя везде вместо числа.

1

for (int x = 0; x < 8; x++)
{
board[0][x] = Pawn;
board[7][x] = Pawn;
}

Я думаю, что 7 является максимумом для этого массива.

0

Как утверждают все остальные, это board[8][x] = Pawn это вызывает ошибку.

Хотя это, скорее всего, тестовая программа, а не что-то, что войдет в производство, но все же я хотел бы посоветовать одно предостережение, всегда старайтесь избегать чисел / жестко закодированных строк / целых чисел или чего-либо еще, в вашем коде по той причине, Вы обычно заканчиваете тем, что делаете вещи как это. И однажды, когда проект пойдет в производство и, возможно, ваш начальник примет решение изменить значение, скажем, 100 x 100, вам будет очень трудно делать что-то.

Хорошие способы сделать это:

static const int BoardSize = 10;

или же

#define BoardSize 10;
0
По вопросам рекламы [email protected]