Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
14 / 20 / 14
Регистрация: 20.03.2018
Сообщений: 485
1

Тетрис в консоли: почему выбрасывается исключение?

06.05.2018, 18:02. Показов 1298. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Чувачки можете обьяснить почему у меня идет это прерывание ?

C++
1
Необработанное исключение по адресу 0x01037454 в TETRIS_K.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x003BB000.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include "stdafx.h"
#include<conio.h>
#include<iostream>
using namespace std;
#include<windows.h>
 
 
 
wstring tetromino[7];
int nFieldWidth = 12;
int nFieldHeight = 18;
unsigned char*pField = nullptr;
 
int nScreenWidth = 80;
int nScreenHeight = 30;
 
 
int Rotate(int px, int py, int r)
{
 switch (r % 4)
 {
 case 0: return py * 4 + px; //0 degrees
 case 1: return 12 + py *-(px * 4); //90 degrees
 case 2: return 15 - (py * 4) - px; //180 degrees
 case 3: return 3 - py + (px * 4); //270 degrees
 }
 
 return 0;
}
 
bool DoesPieceFit(int nTetromino, int nRotation, int nPosX, int nPosY)
 
{
 for (int px = 0; px < px; px ++)
 for (int py = 0; py < 4; py++)
 
 {
  //Get index into piece
  int pi = Rotate(px, py, nRotation);
  // get index into field
  int fi = (nPosY + py)*nFieldWidth + (nPosX + px);
 
 
 
  if (nPosX + px >= 0 && nPosX + px < nFieldWidth)
  {
   if (nPosY + py >= 0 && nPosY + py < nFieldHeight)
   {
 
    if (tetromino[nTetromino][pi] == L'X'&& pField[pi] != 0)
     return false; //fail on first hit coolision detection
   }
  }
 }
  
  return true;
}
 
int main()
{    // Create assets
 tetromino[0].append(L"..X.");
 tetromino[0].append(L"..X.");
 tetromino[0].append(L"..X.");
 tetromino[0].append(L"..X.");
 
 
 tetromino[1].append(L"..X.");
 tetromino[1].append(L".XX.");
 tetromino[1].append(L".X..");
 tetromino[1].append(L"....");
 
 
 
 tetromino[2].append(L".X..");
 tetromino[2].append(L".XX.");
 tetromino[2].append(L"..X.");
 tetromino[2].append(L"....");
 
 
 
 tetromino[3].append(L"....");
 tetromino[3].append(L".XX.");
 tetromino[3].append(L".XX.");
 tetromino[3].append(L"....");
 
 
 
 tetromino[4].append(L"..X.");
 tetromino[4].append(L".XX.");
 tetromino[4].append(L"..X.");
 tetromino[4].append(L"....");
 
 
 tetromino[5].append(L"....");
 tetromino[5].append(L".XX.");
 tetromino[5].append(L"..X.");
 tetromino[5].append(L"..X.");
 
 
 tetromino[6].append(L"....");
 tetromino[6].append(L"..XX");
 tetromino[6].append(L"..X.");
 tetromino[6].append(L"..X.");
 
 
 pField = new unsigned char[nFieldWidth*nFieldHeight];
 for (int x = 0; x < nFieldWidth; x++) //Boeard Boundary
 for (int y = 0; x < nFieldHeight; y++)
  pField[y*nFieldWidth + x] = (x == 0 || x == nFieldWidth - 1 || y == nFieldHeight - 1) ? 9 : 0;
 
 
 wchar_t * screen = new wchar_t[nScreenWidth*nScreenHeight];
 for (int i = 0; i < nScreenWidth; i++) screen[i] = L' ';
 HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
 SetConsoleActiveScreenBuffer(hConsole);
 DWORD dwBytesWritten = 0;
 
 bool bGameover = false;
 
 int nCurrentPiece = 0;
 int nCurrentRotation = 0;
 int nCurrentX = nFieldWidth / 2;
 int nCurrentY = 0;
 
 
 while (!bGameover)
 {
 
  //GAME TIMING ==========================
 
 
  ////////
 
 
 
 
  // INPUT ======================
 
 
  //GAME LOGIC =============================
 
  //RENDER OUTPUT
 
 
  //draw field
 
  for (int x = 0; x < nFieldWidth; x++)
  for (int y = 0; y < nFieldHeight; y++)
   screen[(y + 2)*nScreenWidth + (x + 2)] = L" ABCDEFG=#"[pField[y*nFieldWidth + x]];
 
    //Draw Current Piece
  for (int px = 0; px < 4; px++)
  for (int py = 0; py < 4; py++)
  if (tetromino[nCurrentPiece][Rotate(px, py, nCurrentRotation)] == L'X')
   screen[(nCurrentY + py + 2)*nScreenWidth + (nCurrentX + px + 2)] = nCurrentPiece + 65;
 
 
 
 
  // Display Frame
  WriteConsoleOutputCharacter(hConsole, screen, nScreenWidth*nScreenHeight, { 0, 0 }, &dwBytesWritten);
  system("pause");
 }
 return 0;
}
Добавлено через 3 часа 48 минут
Одну ошибку сам нашел px < px считать как px<4 но прерывание где то в районе HANDLING ето не влияло на ошибку
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2018, 18:02
Ответы с готовыми решениями:

Почему не выбрасывается исключение, если файл не открыт?
Почему не кидает исключение , если файл не открыт void SmartArray::to_File(string path) { ...

Стек: почему выбрасывается исключение?
//Compiler: 3.3.5.1662 unit TypeStack; interface type T = integer; PNode =...

Выбрасывается исключение
Добрый вечер, киберфорумчане! Возникла проблема, надеюсь на вашу помощь!)) P.S. Ниже приложен...

Выбрасывается исключение при попытке подключения к БД
При запуске кода выдает исключение, classpath настроил. Не знаю, что делать. В чем может быть...

10
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,073
Записей в блоге: 3
18.05.2018, 18:59 2
vs2015 не линкует ексешник. т.к. ошибки компиляции.
Пришлось поправлять, чтоб слинковать ексешник.

Далее выяснилось, что цикл на 107 строке представляет собой "черную дыру"
Т.е. там программа умирает и управление уже не передается на стейтмент в 112 строке.

короч, правь цикл на 107 строке
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.05.2018, 19:16 3
C++
1
for (int y = 0; x < nFieldHeight; y++)
может j < nFieldHeight? копипаста - опасная вещь
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
18.05.2018, 19:29 4
Цитата Сообщение от mat_for_c Посмотреть сообщение
копипаста - опасная вещь
ага
Цитата Сообщение от mat_for_c Посмотреть сообщение
j
речь то о игреке идет
Цитата Сообщение от mrden777 Посмотреть сообщение
for (int y = 0; x < nFieldHeight; y++)
1
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.05.2018, 19:42 5
Цитата Сообщение от ValeryS Посмотреть сообщение
речь то о игреке идет
Цитата Сообщение от mat_for_c Посмотреть сообщение
а просто промахнулся клавишей
как-то так
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,073
Записей в блоге: 3
18.05.2018, 20:07 6
mat_for_c,
да, ты прав абсолютно, на счет копипасты)))

вижу это:
https://fastpic.co/images/2018... fc005c.jpg

но не вижу исключения)
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.05.2018, 20:14 7
Цитата Сообщение от XLAT Посмотреть сообщение
но не вижу исключения)
выход за границы массива - это UB (неопределенное поведение).
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,073
Записей в блоге: 3
18.05.2018, 20:16 8
Цитата Сообщение от mat_for_c Посмотреть сообщение
выход за границы массива - это UB (неопределенное поведение).
не умничай),
как мне вчера сказал один чувак, в защиту своего советчика назвавшего константную строку динамическим массивом.

в какое то время я их наелся столько, что походу все съел, раз уж давно не видел)
0
mat_for_c
18.05.2018, 20:31
  #9

Не по теме:

Цитата Сообщение от XLAT Посмотреть сообщение
не умничай),
как мне вчера сказал один чувак, в защиту своего советчика назвавшего константную строку динамическим массивом.
в какое то время я их наелся столько, что походу все съел, раз уж давно не видел)
я не понял, о чем вы говорите :scratch:

0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,073
Записей в блоге: 3
18.05.2018, 21:30 10
Цитата Сообщение от mat_for_c Посмотреть сообщение
я не понял, о чем вы говорите
я говорю: вопрос исчерпан.
придет топикастер - закроет тему.
0
14 / 20 / 14
Регистрация: 20.03.2018
Сообщений: 485
18.05.2018, 22:55  [ТС] 11
Я в матрицы не врубаюсь поэтому было интересно код проверить
Вроде ошибок не было в коде до первой проверки вот оригинал
https://www.youtube.com/watch?v=8OK8_tHeCIA&t=205s
0
18.05.2018, 22:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.05.2018, 22:55
Помогаю со студенческими работами здесь

Непонятно из-за чего выбрасывается исключение NullReferenceException
Вот фрагмент кода for (int i=0;i&lt;massive1.Length; i++){ string x; ...

Работа с классами: выбрасывается исключение на push
Доброго времени суток. То ли глаз замылился и я не вижу простую ошибку, то ли я не понимаю, как...

Выбрасывается исключение java.lang.NullPointerException
Здравствуйте! Помогите решить задачу! При покупке канц. товаров должен выводиться по имени и по...

Выбрасывается исключение при создании класса
Как объявить класс и поля с методами и функциями в нем?? Пытался сделать так но выводит исключение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru