Почему в двумерном массиве отображаются элементы, которые я не добавлял?

У меня проблема с моим кодом.

Когда я добавляю элемент в 2d-массив, вместо этого добавляется два. Вот некоторые результаты, которые помогут объяснить проблему:

Blank game board:

0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 

Adding to board: 7, 0
After adding first piece:

0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 7 
7 0 0 0 0 0 0 0 

Found a 7 at: 6, 7
Found a 7 at: 7, 0

Я инициализирую 2D-массив (я пробовал локально и глобально), где каждый элемент равен 0. Затем я добавляю игровую фигуру на доску.

Вот мой полный код:

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;


// 2D array representing the board
int gameBoard[7][7];

// Translates chess code to array index
int translate(char letter){

  if ( letter == 'a' || letter == '8' ){
    return 0;
  } else if ( letter == 'b' || letter == '7' ){
    return 1;
  } else if ( letter == 'c' || letter == '6' ){
    return 2;
  } else if ( letter == 'd' || letter == '5' ){
    return 3;
  } else if ( letter == 'e' || letter == '4' ){
    return 4;
  } else if ( letter == 'f' || letter == '3' ){
    return 5;
  } else if ( letter == 'g' || letter == '2' ){
    return 6;
  } else if ( letter == 'h' || letter == '1' ){
    return 7;
  } else {
    return -1;
  }

}

// Displays current game board
void showBoard(){

  for (int i = 0; i <= 7; i++) {
    for (int j = 0; j <= 7; j++) {
      cout << gameBoard[i][j] << " ";
    }
    cout << endl;
  }
  cout << endl;
}

// Initiates game board
void initBoard(){

  for (int i=0; i <= 7; i++){
    for (int j=0; j <= 7; j++){

      gameBoard[i][j] = 0;

    }
  }

}

// Adds a piece to the board
void addPiece(string square){

  int x = translate(square[1]);
  int y = translate(square[0]);

  cout << "Adding to board: " << x << ", " << y << endl;
  gameBoard[x][y] = 7;

}

int main() {

  // Initialize game board with zeros
  initBoard();

  // Display 2d array (game board)
  cout << "Blank game board:\n\n";
  showBoard();

  // Place first piece on board
  string firstPiece = "a1";
  addPiece(firstPiece);

  // Display 2d array (game board)
  cout << "After adding first piece:\n\n";
  showBoard();


  for (int i = 0; i <= 7; i++){
    for (int j = 0; j <= 7; j++){

      if (gameBoard[i][j] == 7){

        cout << "Found a 7 at: " << i << ", " << j << endl;

      }

    }

  }


}



Я могу подтвердить, что эта часть «перевода» работает правильно. Все, что здесь происходит, — это перевод a1 в 7 и 0 для координат строки и столбца.

Как видите, даже выполнение программы согласно с тем, что на доску добавляется только 1 элемент. Так почему же я продолжаю находить двоих? Любая помощь будет очень признательна, спасибо!

Я пробовал объявить массив (GameBoard) разными способами, и он все равно добавляет два, когда я добавляю только один элемент. Я хочу, чтобы на GameBoard был добавлен только один элемент.

Эта проблема возникает не для каждой клетки, на которую я решаю добавить фигуру. Допустимые поля связаны с шахматной доской, поэтому a1-h8.

в массиве из 7 элементов 7 элементов, но ваши циклы for (int i = 0; i <= 7; i++) { имеют 8 итераций. Последний действительный индекс в массиве из 7 элементов равен 6, а не 7.

463035818_is_not_an_ai 28.06.2024 00:34
int gameBoard[7][7]; и for (int i = 0; i <= 7; i++). Размеры не совпадают. Шахматная доска имеет размер 8x8, что означает, что ее следует объявить как int gameBoard[8][8], и вы обычно записываете условие циклов for с меньшим, а не меньшим или равным, что будет выглядеть следующим образом: for (int i = 0; i < 8; i++). С помощью вашего текущего кода вы получаете доступ к элементам, которые не существуют, потому что 2d-массив недостаточно велик. Это означает, что ваша программа имеет неопределенное поведение (UB).
Joel 28.06.2024 00:35

или, что еще лучше, используйте std::array и диапазон на основе циклов for

463035818_is_not_an_ai 28.06.2024 00:36

Кстати, вашу функцию translate() можно упростить до двух if, например: int translate(char letter){ if ( letter >= 'a' && letter <= 'h' ) { return letter - 'a'; } else if ( letter >= '1' && letter <= '8' ) { return 8 - (letter - '0'); } else { return -1; } }

Remy Lebeau 28.06.2024 01:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы объявляете массив с помощью int array[7], длина массива равна 7, поэтому максимальный индекс равен 6.

int array[] = { 1, 2, 3, 4, 5, 6, 7 };
//       index: 0, 1, 2, 3, 4, 5, 6

Когда вы используете любой индекс, превышающий максимальный индекс (или меньше нуля), вы получаете доступ к памяти, которая не принадлежит вам. Это может вызвать такие проблемы, как сбой, если эта память содержит ваш код.

Чтобы решить эту проблему, инициализируйте игровое поле правильной длины. Шахматная доска имеет размер 8x8, поэтому вам следует изменить строку int gameBoard[7][7]; на int gameBoard[8][8];. В моем тестировании это устранило проблему.

Другие вопросы по теме

Похожие вопросы

Android NDK: ошибка компиляции с std::execution в C++17
Можно ли определить, не имеет ли перечисление фиксированного базового типа?
Как настроить мои библиотеки и зависимости для компиляции моего приложения как статического
Принципы и практика программирования Страуструпа, 3-е издание, графика: почему передача функции обратного вызова в Window::timer_wait дает неожиданные результаты?
Почему я получаю ошибки «неопределенной ссылки» при попытке использовать OpenCV в Qt Creator с MinGW?
ESP-IDF: Модульные тесты с Unity и C++
Как передать constexpr в конструктор?
При поиске количества точек внутри некоторой фигуры с помощью KD-Tree нужно ли нам проверять пересечение областей или просто сравнивать свойства, соответствующие глубине?
Использование std::enable_if во избежание неоднозначной перегрузки шаблонных бинарных операторов
Арифметическая ошибка, вызванная опцией -O3 в g++