Ошибка проверки во время выполнения # 2 — Поврежден стек вокруг переменной ‘positions’

#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