Пишу небольшую библиотечку для ноунейм дисплея. Столкнулся с проблемкой. Гуглил, но не нашел. В общем, есть 3-х мерный массив. Содержит буквы алфавита -> строку буквы -> и столбец строки со значением пикселя: Код (C++): byte letters[24][8][8] = { {{0,0,1,0,0,0,1,0}, {0,0,1,0,0,0,1,0}, {0,0,1,0,0,0,1,0}, {0,0,1,0,1,0,1,0}, {0,0,1,0,1,0,1,0}, {0,0,1,0,1,0,1,0}, {0,0,0,1,0,1,0,0}, {0,0,0,0,0,0,0,0}}, ... }; Весь алфавит выкладывать не стал. Возьмем один пример. Тут содержится буква W. Есть функция печати текста по координатам: Код (C++): void printText(String text, int x, int y, int scale = 1){ for(int i=0; i<text.length(); i++) { int charDec = int(text[i])-32; printChar(letters[0], 50, 50+i*sizeChar*scale); } } В ней мы рабираем строку, символ переводим в int, и вынемаем по индексу из letters. Для примера я беру сразу нулевой индекс, в котором лежит W. Функция printChar печатает уже данный символ на экране: Код (C++): void printChar(byte ch[sizeChar][sizeChar], int x, int y, int scale = 1, int bgcolor = Black, int textcolor = Green){ int _w = sizeChar; int _h = sizeChar; set_windows(x, y, x + (_h * scale) -1, y + (_w * scale) - 1); int c; rotationChar(ch); for(int i=0; i<_w; i++){ for(int _t = 0; _t < scale; _t++){ for(int j=0; j<_h; j++){ if(ch[i][j]){ c = textcolor; } else { c = bgcolor; } for(int _f = 0; _f < scale; _f++){ lcd_data(c >> 8); lcd_data(c); } } } } } Тут нас интересует только строка rotationChar(ch); В ch содержится двумерный массив - буква W, которую получили из пред. функции. Передаем ее в функцию поворота массива rotationChar: Код (C++): /* * Поворот символа */ void rotationChar(byte ch[][sizeChar], int rotation = 1){ int tmp; for(int i=0; i<sizeChar/2; i++) { for(int j=i; j<sizeChar-1-i; j++){ tmp = ch[i][j]; if(rotation) { // По часовой стрелке ch[i][j] = ch[sizeChar-j-1][i]; ch[sizeChar-j-1][i] = ch[sizeChar-i-1][sizeChar-j-1]; ch[sizeChar-i-1][sizeChar-j-1] = ch[j][sizeChar-i-1]; ch[j][sizeChar-i-1] = tmp; } else { // Против часовой стрелке tmp = ch[i][j]; ch[i][j] = ch[j][sizeChar-1-i]; ch[j][sizeChar-1-i] = ch[sizeChar-1-i][sizeChar-1-j]; ch[sizeChar-1-i][sizeChar-1-j] = ch[sizeChar-1-j][i]; ch[sizeChar-1-j][i] = tmp; } } } } Поворачиваем массив. Проблема в том, что если вызвать функцию печати: printText("WWWW", 50, 50); То получаем вот такой результат: Т.е. буква крутиться по кругу. А результат должен быть что единожды повернулась. Т.е. получается, что я передаю в функции не данные, а указать на элементы массива. А нужно данные, или копию что ли. В общем, как быть, что делать?
В представенных Вами функциях Вы передаете указатель на исходный массив. В результате вызова этих функций, исходный массив будет содержать повернутую букву, которая еще раз повернется при повторном вызове цепочки функций. Попробуйте в функцию 'rotationChar' передавать указатель на копию масива, т.е. в функции 'printChar' перед вызовом функции 'rotationChar' создать копию массива.
Ну да, массив - это и есть указатель. Еще погуглил, выяснил, что передать массив по значению невозможно. Есть только костыли: обернуть массив классом и передать объект, обернуть структурой и передать ее, или как вы советовали сделать копию и передавать копию. Я так и поступил. Спасибо.