- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
int _DIRECTION = 0;
int _WIDTH = 10;
int _HEIGHT = 20;
int _TICK = 500;
int _SCALE = 20;
int _CELLS = _WIDTH * _HEIGHT;
int _WIDTH_GENERAL = _WIDTH * _SCALE;
int _HEIGHT_GENERAL = _HEIGHT * _SCALE;
void _ENTITY::_ENTITY_PARAMETERS(bool x, bool z)
{
_MOVABLE = x;
_STATIC = z;
}
void _KEYBOARD(int _KEY, int _COORD_X, int _COORD_Y)
{
if (_DIRECTION == 0)
{
if (_KEY == _UP_KEY)
_ROTATION = true;
if (_KEY == _DOWN_KEY)
if (_ACCELERATE == false)
_ACCELERATE = true;
else
_ACCELERATE = false;
if (_KEY == _RIGHT_KEY)
{
_DIRECTION = _RIGHT;
}
if (_KEY == _LEFT_KEY)
{
_DIRECTION = _LEFT;
}
}
}
void _TETRIS::_TETRIS_SET_DIRECTION()
{
if (_DIRECTION != 0)
{
if (_DIRECTION == _RIGHT)
{
for (int _ENTITY = 0; _ENTITY < (_HEIGHT * _WIDTH); ++_ENTITY)
{
_TEMP_INS = _ENTITIES[_ENTITY]._ENTITY_SHOW_MOVABLE();
if (_TEMP_INS = true)
{
if ((_ENTITY * _WIDTH) == (_WIDTH - 1))
_DIRECTION = 0;
else
_MOVE_FLAG = true;
}
}
if (_MOVE_FLAG == true)
{
for (int _ENTITY = 0; _ENTITY < (_HEIGHT * _WIDTH); ++_ENTITY)
{
_TEMP_INS = _ENTITIES[_ENTITY]._ENTITY_SHOW_MOVABLE();
if (_TEMP_INS = true)
{
_TEMP_INS = _ENTITIES[_ENTITY + 1]._ENTITY_SHOW_STATIC();
if (_TEMP_INS == true)
{
_MOVE_FLAG = false;
_DIRECTION = 0;
}
}
}
}
if (_MOVE_FLAG == true)
{
for (int _ENTITY = (_HEIGHT * _WIDTH) - 1; _ENTITY >= 0; --_ENTITY)
{
_TEMP_INS = _ENTITIES[_ENTITY]._ENTITY_SHOW_MOVABLE();
if (_TEMP_INS = true)
{
_ENTITIES[_ENTITY]._ENTITY_PARAMETERS(false, false);
_ENTITIES[_ENTITY + 1]._ENTITY_PARAMETERS(true, false);
_MOVE_FLAG = false;
_DIRECTION = 0;
}
}
}
}
}
}
Вот этот код выдаёт Segmentation fault. Массив обьектов _ENTITIES из 200 обьектов. Перед ошибкой заполняет екран кроме двух первых клеток снизу. ВТФ?
1024-- 18.03.2017 23:15 # +1
В циклах _ENTITY проходит от 0 до 199. В них безусловно используется _ENTITIES[_ENTITY], а также _ENTITIES[_ENTITY + 1] - по условию. Если условие истинно, при _ENTITY равном 199 будет выход за границы массива. Если немного поглядеть на условие, станет очевидным, что оно всегда истинно в силу особенностей C-подобных языков. Т.е. в каждом из циклов имеет место выход за границы массива.
Что можно посоветовать автору кода?
1. Попробовать посмотреть на программу с математической точки зрения.
2. Использовать assert (из <cassert>) и вставить assert(X >= 0 && X < 200); перед любым _ENTITIES[X].
3. Использовать отладчик или отладочную печать (можно, например, выводить в cerr и перенаправить его в файл, если в cout выводится псевдографика)
А также:
1. Переосмыслить свой стиль именования
2. Осознать унарный оператор "отрицание" (восклицательный знак)
3. Осознать, что X == true в условии эквивалентно X
Shantykoff 18.03.2017 23:20 # 0
1024-- 18.03.2017 23:32 # 0
Это хорошо, как минимум отладочная печать заработает.
> что не так с именами?
Неканоничные они. Даже противозаконные, если верить http://stackoverflow.com/a/228797
> отрицание
строки 23-26
> Выходить по сути не должен
> и математически всё в For объяснено
Должен.
Ну ладно, если _ENTITY_SHOW_MOVABLE вдруг меняет _WIDTH, _HEIGHT или _ENTITY, то не выходит. Иначе выходит за границы и читает из 200-го элемента.
> такая система используется и в заполнении, и в удалении объектов
Могло повезти, на то и неопределённое поведение.
Shantykoff 18.03.2017 23:39 # 0
1024-- 18.03.2017 23:42 # 0
Как минимум, в представленной здесь версии кода будет выведено "200!" перед тем, как программа обратится к 200му элементу.
barop 18.03.2017 23:46 # 0
как пхпшники, чесслово
1024-- 18.03.2017 23:51 # 0
> как пхпшники, чесслово
А зачем дебаггер? Как мне кажется, это как пушкой по воробьям. Не настолько же Shantykoff не знает свою программу, что только полное погружение поможет.
Shantykoff 18.03.2017 23:54 # 0
barop 19.03.2017 00:02 # 0
medcectpa 19.03.2017 00:10 # 0
barop 19.03.2017 00:20 # 0
medcectpa 19.03.2017 00:24 # 0
Налицо сразу два диагноза: 1. копролалия; 2. слепота (медсестра - она).
Приходите к нам, под пианино попляшем.
barop 19.03.2017 00:27 # 0
стертор, ты на гормонах чилишоли?
medcectpa 19.03.2017 00:28 # 0
Bopmand 19.03.2017 00:29 # 0
ncuxuamp 19.03.2017 00:30 # +1
barop 19.03.2017 00:35 # 0
barop 19.03.2017 00:36 # 0
barop 19.03.2017 00:30 # 0
barop 19.03.2017 00:36 # 0
barop 19.03.2017 00:36 # 0
barop 19.03.2017 00:36 # 0
ncuxuamp 19.03.2017 00:38 # 0
barop 19.03.2017 00:39 # 0
medcectpa 19.03.2017 00:40 # 0
barop 19.03.2017 00:44 # 0
с пивасой?
ncuxuamp 19.03.2017 00:44 # 0
barop 19.03.2017 00:52 # 0
barop 19.03.2017 01:00 # 0
barop 19.03.2017 01:01 # 0
barop 19.03.2017 01:02 # 0
1024-- 19.03.2017 14:51 # 0
Shantykoff 18.03.2017 23:46 # 0
Shantykoff 18.03.2017 23:26 # 0
barop 18.03.2017 23:27 # 0
Shantykoff 18.03.2017 23:30 # 0
guestinh0 18.03.2017 23:30 # 0
barop 18.03.2017 23:31 # 0
Shantykoff 18.03.2017 23:31 # 0
ncuxuamp 18.03.2017 23:35 # 0
Shantykoff 18.03.2017 23:36 # 0
ncuxuamp 18.03.2017 23:39 # 0
Сейчас придёт медсестра и сделаем Вам укол.
Shantykoff 18.03.2017 23:41 # 0
medcectpa 18.03.2017 23:44 # 0
1024-- 18.03.2017 23:46 # 0
medcectpa 18.03.2017 23:52 # 0
Не желаете к нам?
1024-- 18.03.2017 23:54 # 0
medcectpa 18.03.2017 23:58 # +2
Борманда забрали мы.
medcectpa 18.03.2017 23:40 # 0
3_16dar 18.03.2017 23:31 # 0
XEP 18.03.2017 23:32 # 0
bagor 18.03.2017 23:33 # 0
MilosTeodosic 18.03.2017 23:33 # 0
MOCKBA_O4KO 18.03.2017 23:34 # 0
XEP 18.03.2017 23:35 # 0
Dr_Stertor 18.03.2017 23:36 # 0
3_28dar 18.03.2017 23:37 # 0
guestinh0 18.03.2017 23:40 # 0
XEP 18.03.2017 23:40 # 0
3_16dar 18.03.2017 23:41 # 0
barop 18.03.2017 23:41 # 0
MilosTeodosic 18.03.2017 23:41 # 0
bagor 18.03.2017 23:41 # 0
MOCKBA_O4KO 18.03.2017 23:41 # 0
3_28dar 18.03.2017 23:41 # 0
bayan 18.03.2017 23:41 # 0
Dr_Stertor 18.03.2017 23:41 # 0
bagor 18.03.2017 23:46 # 0
3_28dar 18.03.2017 23:46 # 0
XEP 18.03.2017 23:46 # 0
3_16dar 18.03.2017 23:46 # 0
Dr_Stertor 18.03.2017 23:46 # 0
bayan 18.03.2017 23:46 # 0
MilosTeodosic 18.03.2017 23:47 # 0
guestinh0 18.03.2017 23:47 # 0
MOCKBA_O4KO 18.03.2017 23:47 # 0
barop 18.03.2017 23:54 # 0
bagor 18.03.2017 23:54 # 0
guestinh0 18.03.2017 23:54 # 0
XEP 18.03.2017 23:54 # 0
MilosTeodosic 18.03.2017 23:55 # 0
3_16dar 18.03.2017 23:55 # 0
MOCKBA_O4KO 18.03.2017 23:55 # 0
3_28dar 18.03.2017 23:55 # 0
Dr_Stertor 18.03.2017 23:55 # 0
bayan 18.03.2017 23:55 # +1
bagor 18.03.2017 23:59 # 0
3_28dar 18.03.2017 23:59 # 0
XEP 18.03.2017 23:59 # 0
barop 18.03.2017 23:59 # 0
guestinh0 18.03.2017 23:59 # 0
MilosTeodosic 18.03.2017 23:59 # 0
bayan 18.03.2017 23:59 # 0
MOCKBA_O4KO 18.03.2017 23:59 # 0
3_16dar 18.03.2017 23:59 # 0
Dr_Stertor 19.03.2017 00:00 # −102
medcectpa 19.03.2017 00:01 # 0
bagor 19.03.2017 14:53 # 0
barop 19.03.2017 14:53 # 0
MilosTeodosic 19.03.2017 14:53 # 0
3_16dar 19.03.2017 14:53 # 0
XEP 19.03.2017 14:53 # 0
barop 19.03.2017 14:54 # 0
XEP 19.03.2017 14:54 # 0
guestinh0 19.03.2017 14:54 # 0
bagor 19.03.2017 14:54 # 0
3_16dar 19.03.2017 14:54 # 0
MilosTeodosic 19.03.2017 14:55 # 0
MOCKBA_O4KO 19.03.2017 14:55 # 0
XEP 19.03.2017 14:55 # 0
3_28dar 19.03.2017 14:55 # 0
3_29dar 19.03.2017 14:55 # 0
Dr_Stertor 19.03.2017 14:55 # −102
bayan 19.03.2017 14:55 # 0