2016-12-20 7 views
-6

Я делаю игру tetris в C++ и в функции DrawBoard(). Я получаю сообщение об ошибке: Исключение, которое было выбрано в 0x0F52DA36 (sfml-graphics-d-2.dll) в Tetris_C++. exe: 0xC0000005: место записи нарушения доступа 0x013EDA88.SFML Нарушение прав доступа

Если есть обработчик для этого исключения, программа может быть безопасно продолжена.

Вот код:

void DrawBoard() { 

for (int i = 0; i < boardWidth; i++) 
{ 
    for (int j = 0; j < boardHeight; i++) 
    { 
     switch (board[i][j]) {//What's wrong with this? 
     case 'b': 
      squares[i][j].setFillColor(sf::Color::Blue); 
      break; 
     case 'c': 
      squares[i][j].setFillColor(sf::Color::Cyan); 
      break; 
     case 'y': 
      squares[i][j].setFillColor(sf::Color::Yellow); 
      break; 
     case 'o': 
      squares[i][j].setFillColor(sf::Color(255, 165, 0));//Orange 
      break; 
     case 'p': 
      squares[i][j].setFillColor(sf::Color(150, 50, 250));//Purple 
      break; 
     default: 
      break; 
     } 
    } 
} 

for (int x = 0; x < boardWidth; x++) { 
    for (int y = 0; y < boardHeight; y++) { 
     window.draw(squares[x][y]); 
    } 
} 

}

+1

Добро пожаловать на переполнение стека. Пожалуйста, найдите время, чтобы прочитать [The Tour] (http://stackoverflow.com/tour) и обратитесь к материалу из [Справочного центра] (http://stackoverflow.com/help/asking) о том, что и как вы можете спросите здесь. –

+2

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+3

Не зная, что такое 'board' и' squares', никто не сможет вам помочь. –

ответ

0

ошибка просто означает, что ваша программа пыталась получить доступ к памяти за пределами своего адресного пространства. Но, не видя SSCCE, вы не можете знать, где находится ваша ошибка. A guess будет заключаться в том, что одна из ваших переменных вышла за рамки или вы пытаетесь получить доступ за пределы вашего массива squares, но опять же это только предположение, основанное на неполной информации.

0
for (int j = 0; j < boardHeight; i++) 

это то, что делает вы получаете ошибки сегментации (я уверен, его опечатка)

вы получите только 1 итерацию для внешнего контура, а затем внутренний цикл делает Segfault по не увеличивающиеся i до него это становится равным boardwidth

кода является сам объяснительный, поэтому я уверен, что это должно быть:

for (int j = 0; j < boardHeight; j++) 
+0

Спасибо, это была опечатка, и теперь все работает отлично. –