РЕШЕНО Узнать число элементов массива.

Тема в разделе "Микроконтроллеры AVR", создана пользователем Ariadna-on-Line, 3 мар 2025.

  1. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Задал одномерный массив строк-констант без указания размерности.Тупо через запятую вписываю строки произвольной длины не считая. Компилятор сам присвоит им индексы. Как при исполнении узнать максимальный индекс, то бишь число элементов массива ? С уважением.
    ПС. Зря создал тему. все просто : Имеем -
    const String messages[] ;
    Стандартная функция
    int x = sizeof(messages) ;
    x / 6 == количеству строк, элементов массива.
    ППС. Решил сделать маленький билборд, чтоб на лето вывесить рекламку на даче. Нашел проект с бегущей строкой. Сделал вариант "беглеца" с остановкой в нужном месте. Теперь он может и бегать и останавливаться, и обратно возвращаться. Сейчас может гнать строку, показывать время и температуру. Памяти UNO еще 50%. Думаю чем ее еще забить. Всем спасибо.
     

    Вложения:

    Последнее редактирование: 4 мар 2025
  2. DetSimen

    DetSimen Гуру

    а 6 - это чо?

    а вапще, добрые люди пишут так:

    size_t nElem = sizeof(messages)/sizeof(messages[0]);
     
    parovoZZ нравится это.
  3. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Число "6" в реале есть размер идентификатора строки в массиве строк.
    Коды
    Serial.println( sizeof(messages) / sizeof(messages[0])
    и
    Serial.println( sizeof(messages) / 6)
    имеют совершенно одинаковый размер и результат. Это значит, что в коде реально нет процедуры sizeof(messages[0]. Компилятор просто подставляет заранее известное число 6.
     
    Последнее редактирование: 4 мар 2025
  4. DetSimen

    DetSimen Гуру

    Ты ошибаешься, 6 - это размер в байтах экземпляра класса String. Завтра оно может поменяться при очередном исправлении библиотек и твой код работать не будет, а ты себе все волосы на опе вырвешь в попытке понять, что не так. А вот sizeof(message[0]) всегда даст правильный размер.
     
    Ariadna-on-Line нравится это.
  5. AlexU

    AlexU Гуру

    Утверждение верно для конкретной целевой платформы и конкретной реализации класса String. Так лучше не делать.
    Здесь Вы правы. sizeof действительно выполняется на этапе компиляции. Но повторюсь результат sizeof(messages[0]) может быть разным.
    Не правильно. Число "6" -- это размер класса String. Если речь идёт про Arduino, то это: два байта -- указатель на буфер символов char*, два байта -- размер буфера int и два байта -- количество символов в буфере (длина строки) int. И вот эти указатели и int'ы не всегда будут 16-тибитными. Да и полей в другой реализации класса String может быть больше.

    PS: DetSimen немного опередил....
     
    Ariadna-on-Line нравится это.
  6. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Вот что значит профессионалы. Я словами даже сказать не знаю как. А уж тем более сформулировать запрос к гуглу. Потому и задаю вопросы тута.

    Караул. Что-то в последнее время у меня Амперка жутко глючит. Тормозит и даже вылетает. Вот только что в очередной раз.
     
    Последнее редактирование: 4 мар 2025
  7. Asper Daffy

    Asper Daffy Иксперд

    Так то ж добрые.
     
    DetSimen нравится это.