Как получить элемент массива?

Тема в разделе "Arduino & Shields", создана пользователем Patriot, 19 сен 2015.

  1. Patriot

    Patriot Нерд

    Пишу небольшую библиотечку для ноунейм дисплея. Столкнулся с проблемкой. Гуглил, но не нашел.

    В общем, есть 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);
    То получаем вот такой результат:
    [​IMG]

    Т.е. буква крутиться по кругу. А результат должен быть что единожды повернулась. Т.е. получается, что я передаю в функции не данные, а указать на элементы массива. А нужно данные, или копию что ли. В общем, как быть, что делать?:)
     
  2. AlexU

    AlexU Гуру

    В представенных Вами функциях Вы передаете указатель на исходный массив. В результате вызова этих функций, исходный массив будет содержать повернутую букву, которая еще раз повернется при повторном вызове цепочки функций.
    Попробуйте в функцию 'rotationChar' передавать указатель на копию масива, т.е. в функции 'printChar' перед вызовом функции 'rotationChar' создать копию массива.
     
  3. Patriot

    Patriot Нерд

    Ну да, массив - это и есть указатель. Еще погуглил, выяснил, что передать массив по значению невозможно. Есть только костыли: обернуть массив классом и передать объект, обернуть структурой и передать ее, или как вы советовали сделать копию и передавать копию. Я так и поступил. Спасибо.