Откуда хвост у кубика?

Владимир Д.

✩✩✩✩✩✩✩
6 Ноя 2018
9
1
Всем привет.
Пострадал я тут фигней по анимации на светодиодных матрицах с драйвером MAX7219 (в видео про анализатор звука он есть)
Решил ничего готового не искать, а написать сам что-нибудь.
Повспоминал работу с массивами на понеслось.
Сперва был просто падающий дождь. Получилось неплохо, но мало....
Добавил анимацию бегающего куба (знаю, что у Алекса есть подобная анимация на адресных лентах).
У него при попадании и отскакивании от угла иногда появляется хвост.
Если кому не лень будет разбирать мой код (я постарался максимально прокомментировать), подскажите где трабл?
 

Вложения

SergeySAS

✩✩✩✩✩✩✩
20 Дек 2018
41
9
Москва
sustavov.org
Ну там первый вопрос по строке 17. Она противоречит комментарию о координатной сетке матрицы.
int matr[8][32]; - она предполагает использование matr первого индекса от 0 до 7 и второго от 0 до 31. Т.е. первый индекс это Y а второй X.
Весь остальной код использует массив как X Y... Ничего криминального в этом нет, но есть нюансы.
Из-за этого при работе например arrayShiftDown может получиться неверный порядок копирования и загореться лишний диод.
Можно вывести в serial значения:
matrix.height() и matrix.width(). Чтобы понять что есть что?
Коментарии используют РЯД и СТРОКА... А что есть что не понятно.
Например:
void arrayShiftDown() {
// сдвиг вниз на 1 значение
for (int y = 0; y < matrix.height(); y++) { //пробегаем по всем рядам
for (int x = (matrix.width() - 2); x >= 0; x--) { //начиная спредпоследней строки, движемся до первой (индекс 0)
matr[x + 1][y] = matr[x][y]; //присваиваем нижней строке значение текущей.
}
}
}
 

SergeySAS

✩✩✩✩✩✩✩
20 Дек 2018
41
9
Москва
sustavov.org
Специально написал прогу простую на Си, чтобы показать как это работает.
На Mac она отрабатывает так:
#include <stdio.h>


void printMatrix(char* a, int Size);

int main()
{
char matr0[2][3];
char matr[2][3];
char matr2[2][3];

char ch='a';
int i, j;
i=0;
j=0;

//заполняем матрицу a b c d e f
//и матрицу над ней и после нее в памяти 0 и 2 соответственно
for(i=0; i < 2; i++)
{
for(j=0; j < 3; j++)
{
matr0[j]='0';
matr[j]=ch;
matr2[j]='2';
ch++;
}
}

printf("origin matrix:\n");
printf("Matr0: ");
printMatrix(&matr0[0][0], 2*3);

printf("Matr: ");
printMatrix(&matr[0][0], 2*3);

printf("Matr2:");
printMatrix(&matr2[0][0], 2*3);


//портим неверной индексацией
printf("%c\n", matr[2][0]);
matr[2][0] = '1';
//проверяем доступ по неверной индексации
printf("%c\n", matr[2][0]);


printf("new matrix:\n");
printf("Matr0: ");
printMatrix(&matr0[0][0], 2*3);

printf("Matr: ");
printMatrix(&matr[0][0], 2*3);

printf("Matr2:");
printMatrix(&matr2[0][0], 2*3);

return 0;
}

void printMatrix(char* a, int Size)
{
int i =0;
char* b;
b = a;
for (i =0; i < Size; i++)
{
printf(" %c ", *b);
b++;
}
printf("\n");
}



origin matrix:
Matr0: 0 0 0 0 0 0
Matr: a b c d e f
Matr2: 2 2 2 2 2 2
0
1
new matrix:
Matr0: 1 0 0 0 0 0
Matr: a b c d e f
Matr2: 2 2 2 2 2 2

Видно, что работает доступ по неверному индексу, но идет доступ к чужой памяти. Что приводит к глюкам программы