Оператор byte подскажите!

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

  1. olegoriy

    olegoriy Гик

    На прошлую тему не кто не отвечает :( По этому задам вопрос по другому:
    byte Y[X][8][8] = { }; ---- Какое максимальное значение X я могу задать?
    Или если X ограничен то как мне дальше в коде присвоить новое значение Y.
    К примеру:
    byte Y[X][8][8] = { A };
    (дальнейший код)
    (дальнейший код)
    (дальнейший код)
    Хочу чтобы Y[X][8][8] = { B };
     
    Последнее редактирование: 14 фев 2015
  2. ANV

    ANV Гуру

    Применительно к Ардуино - пока память не закончится, которой кот наплакал, а у вас массив трехмерный :)
     
  3. olegoriy

    olegoriy Гик

    Или если X ограничен то как мне дальше в коде присвоить новое значение Y.
    К примеру:
    byte Y[X][8][8] = { A };
    (дальнейший код)
    (дальнейший код)
    (дальнейший код)
    Хочу чтобы Y[X][8][8] = { B };
     
  4. geher

    geher Гуру

    Теоретически любое.
    Практически ограничено объемом свободной части ОЗУ, доступной программе, что зависит от остальной части программы (в которой тоже может использоваться ОЗУ под переменные, стек, выделение динамической памяти) и конкретного микроконтроллера.
    Если переменная Y будет глобальной или static, то память под нее будет выделена в самом начале.
    Если локальная, то память будет выделяться в момент исполнения кода в стеке.
    Если рассматривать Arduino UNO, то ОЗУ там 2 Кбайт. Соответственно, в первом приближении максимальное значение 32, но из него придется вычесть пространство под другие переменные, вызовы функций и прочие накладные расходы, не забывая, что все это тратится не только кодом скетча, но и библиотеками (включая стандартную). Так что в реальности лучше не делать больше 20.
    Чуть улучшить дело можно используя PROGMEM. В этом случае массив будет храниться во флэше, которого в UNO уже 32К. Это в 16 раз больше (т.е. в первом приближении максимум X будет 512), но из этого объема надо не забыть вычесть остальной объем программы и 2К загрузчика).
    http://arduino.cc/en/Reference/PROGMEM
    Только, если не ошибаюсь, в PROGMEM изменять ничего уже не получится. Инициализировать надо при объявлении byte Y[X][8][8] = { 1,2,3,4,... и так далее всего 8*8*X значений };

    Присвоить массиву можно поэлементно
    Код (Text):
    for (int i=0;i<X;i++)
      for (int j=0;j<8;j++)
        for (int k=0;k<8;k++)
          Y[i][j][k]=x;
    или из другого массива при помощи memcpy.
    Можно организовать подгрузку из SD карты (тоже пожлементно), подключив соответствующий шилд или модуль (и потратив на это память под работу библиотеки),
     
  5. olegoriy

    olegoriy Гик

    geher Большое спасибо за содержательный ответ. Буду пробовать предложенные варианты.