Arduino IDE непонятное пишет

Тема в разделе "Arduino & Shields", создана пользователем timon, 15 ноя 2018.

  1. timon

    timon Гик

    День добрый.

    Сижу разбираюсь с компилятором в Arduino IDE и не очень понимаю как такое может быть и от чего зависит. Создал глобальный массив:
    Код (C++):
       unsigned char myRoom[320]={0};

    void setup() {
      myRoom[0] |= (1 << 1); // set bit 1 (00000010)
      myRoom[0] &= ~(1 << 1); // reset bit 1 (00000000)
    }
     
    При проверке пишет "Глобальные переменные используют 469 байт (18%)"... но стоит закомментировать строки и даже присвоить что то элементу массива
    Код (C++):

      unsigned char myRoom[320]={0};

    void setup() {
    //  myRoom[0] |= (1 << 1); // set bit 1 (00000010)
    //  myRoom[0] &= ~(1 << 1); // reset bit 1 (00000000)
        myRoom[1]=1;
    }

    void loop() {
    }
     
    начинает писать "Глобальные переменные используют 149 байт". Но массив-то на месте?

    С чем могут быть связаны такие вот странности?
     
    DetSimen нравится это.
  2. оптимизатор вырезал
     
    timon нравится это.
  3. timon

    timon Гик

    Однако же... ))
    Код (C++):
      unsigned char myRoom[320]={0};

    void setup() {
        myRoom[0]=1;
    }

    void loop() {
      if (myRoom[0]==1) myRoom[0]=0;
    }
    Вернулся обратно к "Глобальные переменные используют 469 байт (18%)"

    Спасибо )
     
  4. b707

    b707 Гуру

    интересно, что вы пытались сказать этой строчкой...
    Код (C++):
    unsigned char myRoom[320]={0};
    сдается мне, что совсем не то, что получилось
     
  5. timon

    timon Гик

    Я хотел определить 320 битовых абстракций (320 байт для работы с их битами) и заполнил их нулями по умолчанию ))
     
  6. b707

    b707 Гуру

    я так и подумал.
    В реальности эта запись инициализирует только один - первый (нулевой) элемент массива.
     
    timon нравится это.
  7. В реальности в C++ переменные автоматически инициализируются нулями.
     
    parovoZZ и timon нравится это.
  8. timon

    timon Гик

    даже так не надо?
    Код (C++):
    unsigned char myRoom[320]={0,};
    То есть просто
    Код (C++):
    unsigned char myRoom[320];
    и там 320 нулей?

    Я думал первый явно нулем - остальные по умолчанию.
     
  9. Вот "по умолчанию" это ноль.
     
    timon нравится это.
  10. Asper Daffy

    Asper Daffy Иксперд

    Только если они статические.
     
  11. parovoZZ

    parovoZZ Гуру

    micra-c запрещает лезть в МК с не статическими переменными.
     
    timon нравится это.
  12. DIYMan

    DIYMan Guest

    См. https://en.cppreference.com/w/c/language/array_initialization - в частности, раздел "Initialization from brace-enclosed lists":
    Код (C++):
    int z[3] = {0}; // z has type int[3] and holds all zeroes
    Оттуда же пример:
    Код (C++):
    int a[MAX] = { // starts initializing a[0] = 1, a[1] = 3, ...
        1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0
    }
    // for MAX=6,  array holds 1,8,6,4,2,0
    // for MAX=13, array holds 1,3,5,7,9,0,0,0,8,6,4,2,0 ("sparse array")
    Потому что:
    Идём в implicit initilization и видим:
    Короче, всё просто :)
     
    DetSimen и timon нравится это.
  13. DIYMan

    DIYMan Guest

    Неправильная реальность, читаем стандарт, улыбаемся и машем. В реальности могут быть случайные значения. сиречь, мусор. Почему - см. стандарт языка.
     
    Kamikadze нравится это.
  14. Всегда умиляют тыкатели в стандарты, стандартов не читавшие.
     
  15. parovoZZ

    parovoZZ Гуру

    можешь пример привести?
     
  16. DIYMan

    DIYMan Guest

    Да пж:
    Код (C++):
    int* a = new int[20];
    Не сделал memset - ССЗБ.
     
  17. DIYMan

    DIYMan Guest

    Всегда умиляли спициализды, всюду поучающие, при этом не знающие самых основ. Такие, как дитятко витюня. Архатушка, узбагойся, тебе здесь не рады.
     
  18. Вот с этим согласен. Не только так, но нюансы есть.
     
  19. DIYMan

    DIYMan Guest

    Ты стандарт-то почитай, дитятко. А потом ВНЕЗАПНО столкнись, что в зависимости от компилятора в куске памяти может быть чёрт те что. То, то ты привёл один пример - не доказывает ровным счётом ничего. Кому я чего доказываю, собственно...

    Короче: не слушаем глупости витюни, потому что он - дилетант, воинствующий. Если напоретесь (а это будет обязательно, слушаючи витюню) на то, что в динамически выделенном куске памяти - мусор, то на всякий - стандарт это оговаривает.
     
    Kamikadze нравится это.