Вопрос про PROGMEM

Тема в разделе "Arduino & Shields", создана пользователем Мерзкий Гуру, 21 мар 2016.

  1. Господа,

    Подскажите, зафиксированы ли где-то правила инициализации массивов?

    char mem[100] = { 1, 2, 3 }; - остаток массива будет заполнен нулями, или мусором?
    а если
    char mem[100] PROGMEM = { 1, 2, 3 }; - что-то можно гарантировать про заполнение?
     
  2. AlexVS

    AlexVS Гик

    Если сам не проинициализируншь, то кто за тебя это сделает? Компилятор? Линковщик?
     
  3. Unixon

    Unixon Оракул Модератор

    Возможно, что-то в стандарте есть про это, не помню.
    На практике эти элементы не инициализируются, там остается то, что было раньше.
     
  4. Вообще-то компилятор вполне способен считать элементы.

    В интернете сведения противоречивы, вплоть до адского варианта:

    Все элементы массива можно также инициализировать одним значением:
    int numbers[6] = {300} // Все элементы инициализированы значением 300
    int numbers[10]={23,123}// Инициализированы только первые два элемента
    В примере который приведен выше все элементы которые не инициализированы принимают значение 0.


    Понятно, лучше инициализировать самому.
     
  5. Onkel

    Onkel Гуру

    не зафиксированы, но обычно нуль в оперативке и 0xFF во всех ячейках eeprom
     
  6. AlexVS

    AlexVS Гик

    Ага, особенно после ребута ;)
     
  7. Onkel

    Onkel Гуру

    зависит от компилятора. А у Вас есть данные, что после ребута в озу остается шум в элементах массива? Бывает при отладке ребутишь десятками, и нули и только нули.
     
  8. Добрался до железки, проверил.
    Всё добивается нулями, PROGMEM тоже.
    Но полагаться на это не будем, раз стандарт неизвестен.
     
  9. ostrov

    ostrov Гуру

    Одно непонятно, зачем использовать память неизвестно чем заполненную?
     
  10. Megakoteyka

    Megakoteyka Оракул Модератор

    Так вопрос в том, нужно ли ее самостоятельно чистить или компилятор сам инициализирует память нулями.
    Иногда не хочется тратить время на проделывание одной и той же операции дважды.
    Насколько я знаю, это зависит от конкретной реализации компилятора.