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

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

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

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

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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.05.2018, 18:02
Ответы с готовыми решениями:

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

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

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

10
Just Do It!
 Аватар для XLAT
4202 / 2658 / 654
Регистрация: 23.09.2014
Сообщений: 8,971
Записей в блоге: 3
18.05.2018, 18:59
vs2015 не линкует ексешник. т.к. ошибки компиляции.
Пришлось поправлять, чтоб слинковать ексешник.

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

короч, правь цикл на 107 строке
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.05.2018, 19:16
C++
1
for (int y = 0; x < nFieldHeight; y++)
может j < nFieldHeight? копипаста - опасная вещь
1
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
18.05.2018, 19:29
Цитата Сообщение от mat_for_c Посмотреть сообщение
копипаста - опасная вещь
ага
Цитата Сообщение от mat_for_c Посмотреть сообщение
j
речь то о игреке идет
Цитата Сообщение от mrden777 Посмотреть сообщение
for (int y = 0; x < nFieldHeight; y++)
1
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
18.05.2018, 19:42
Цитата Сообщение от ValeryS Посмотреть сообщение
речь то о игреке идет
Цитата Сообщение от mat_for_c Посмотреть сообщение
а просто промахнулся клавишей
как-то так
0
Just Do It!
 Аватар для XLAT
4202 / 2658 / 654
Регистрация: 23.09.2014
Сообщений: 8,971
Записей в блоге: 3
18.05.2018, 20:07
mat_for_c,
да, ты прав абсолютно, на счет копипасты)))

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

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

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

Не по теме:

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

0
Just Do It!
 Аватар для XLAT
4202 / 2658 / 654
Регистрация: 23.09.2014
Сообщений: 8,971
Записей в блоге: 3
18.05.2018, 21:30
Цитата Сообщение от mat_for_c Посмотреть сообщение
я не понял, о чем вы говорите
я говорю: вопрос исчерпан.
придет топикастер - закроет тему.
0
 Аватар для mrden777
14 / 20 / 14
Регистрация: 20.03.2018
Сообщений: 485
18.05.2018, 22:55  [ТС]
Я в матрицы не врубаюсь поэтому было интересно код проверить
Вроде ошибок не было в коде до первой проверки вот оригинал
https://www.youtube.com/watch?v=8OK8_tHeCIA&t=205s
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.05.2018, 22:55
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru