#c #structure
#c #структура
Вопрос:
У меня проблема с возвратом структуры. В нем говорится, что ошибка проверки во время выполнения # 2 — Поврежден стек вокруг переменной ‘positions’, и я понятия не имею, почему. Я должен закончить это к сегодняшнему вечеру, чтобы приступить к остальной части проекта. Пожалуйста, помогите, если знаете. спасибо 🙂
struct Position
{
int SrcDstScore[50][5];
char pieceColor [50][2];
};
int Sort(Position s2, Position s1)
{
int x; // use compreto method
return x;
}
Position EvaluateMoves(Piece * theBoard[8][8])
{
//store my result boards here
Position positions;
for (int t=0; t<50; t )
{
positions.SrcDstScore[t][1]= 0;
positions.SrcDstScore[t][2]= 0;
positions.SrcDstScore[t][3]= 0;
positions.SrcDstScore[t][4]= 0;
positions.SrcDstScore[t][5]= 0;
positions.pieceColor[t][1]= ' ';
positions.pieceColor[t][2]= ' ';
//cout << "Eval";
}
char mcPlayerTurn = 'w';
int counter = 0;
// Fetching the board containing positions of these pieces
for (int Row = 0; Row < 8; Row)
{
for (int Col = 0; Col < 8; Col)
{
if (theBoard[Row][Col] != 0)
{
if (theBoard[Row][Col]->GetColor() == 'w')
{
Piece * piece = theBoard[Row][Col];
for (int MoveableRow = 0; MoveableRow < 8; MoveableRow) // Now that we have found the knight find the legal squares.
{
for (int MoveableCol = 0; MoveableCol < 8; MoveableCol)
{
if(piece->IsLegalMove(Row, Col, MoveableRow, MoveableCol, theBoard))
{
cout << counter << theBoard[Row][Col]->GetPiece() << " " << theBoard[Row][Col]->GetColor() <<" " << Row <<" " << Col <<" " << MoveableRow <<" " << MoveableCol << "n";
positions.SrcDstScore[counter][1]= Row;
positions.SrcDstScore[counter][2]= Col;
positions.SrcDstScore[counter][3]= MoveableRow;
positions.SrcDstScore[counter][4]= MoveableCol;
//If the move is a capture add it's value to the score
if (theBoard[MoveableRow][MoveableRow] != 0)
{
positions.SrcDstScore[counter][5] = theBoard[MoveableRow][MoveableRow]->GetValue();
if (theBoard[Row][Row]->GetValue() < theBoard[MoveableRow][MoveableRow]->GetValue())
{
positions.SrcDstScore[counter][5] = theBoard[MoveableRow][MoveableRow]->GetValue() - theBoard[Row][Row]->GetValue();
}
//Add Score for Castling
}
counter ;
}
}
}
}
}
}
}
return positions;
}
Ответ №1:
В начальном цикле вы индексируете в SrcDstScore
и pieceColor
с использованием индексов от 1 до 5 и от 1 до 2 соответственно. Это должны быть индексы от 0 до 4 и от 0 до 1.
То же самое относится ниже, к этой строке и трем после нее:
positions.SrcDstScore[counter][1]= Row;
И в двух случаях, где у вас есть positions.SrcDstScore[counter][5]
, это должно быть ...[4]
Ответ №2:
positions.pieceColor[t][1]= ' ';
positions.pieceColor[t][2]= ' ';
Это должно быть —
positions.pieceColor[t][0]= ' ';
positions.pieceColor[t][1]= ' '; // Array index starts from 0 to numElements - 1.
И с Position::SrcDstScore
тоже тот же случай. Индекс массива начинается с 0 до 4.
Комментарии:
1. @GeeKaush — В общем, когда вы получаете такого рода ошибки во время выполнения, это указывает на то, что переменные пытаются получить доступ к местоположениям, которым они не назначены.
2. @GeeKaush — Рад, что смог вам помочь.
Ответ №3:
Если переменная theBoard
представляет собой 2D массив или указатель на 2D массив Piece
с размерами как 8 * 8
(для шахматной доски), то объявление функции должно выглядеть следующим образом:
Position EvaluateMoves(Piece (*theBoard)[8]) // 1st way
Position EvaluateMoves(Piece theBoard[][8]) // 2nd(a) way
Position EvaluateMoves(Piece theBoard[8][8]) // 2nd(b) way
Position EvaluateMoves(Piece (amp;theBoard)[8][8]) // 3rd way, preferred if theBoard is an array